Python成长记八(函数)

函数

特点:(1)功能性(2)隐藏细节 (3)避免编写重复的代码

1.内置函数round()
案例:取小数点后两位
a = 3.141592654
result = round(a,2)
print(result)
输出:3.14

2.查看内置函数的功能
使用help()函数查看
比如:help(print)
查看python之禅:import this

3.函数的基本结构:
 def funcname(parameter_list):
     pass
 说明:1.参数列表可以没有 2.return value 如果没有返回值则默认返回None

案例:使用函数实现两个数相加 和 实现一个打印函数
import sys
sys.setrecursionlimit(10000) #设置递归调用的最大限制,默认是900多次(拓展部分在写算法时经常用到)

def add(a,b):
    return a+b

def print_result(code):
    print(code)

a = add(1,2)
b = print_result('我是一个打印函数')
print(a,b)
结果:
我是一个打印函数
3 None

解释函数执行流程:1.执行到b变量的赋值时调用了打印函数故打印出‘我是一个打印函数’ 2. 输出None是因为打印函数没有返回值故默认为None

小提示:
    1.如果函数中只有一个return语句,则return后面的语句不再执行
    2.函数可以返回任意类型的值

4.如何让函数返回多个结果
案例:
  def test(a,b):
    res1 = a * 5
    res2 = b *2 +6
    return res1,res2

 result = test(6,8)
 print(type(result))
输出结果:<class 'tuple'>
解释:返回结果可以是元组、列表等,默认是元组

如何使用返回的结果:
 res1_a,res2_b = test(6,8)
 print(res1_a,res2_b)
 输出结果:30 22

5.序列解包与链式赋值
赋值:
 a = 1
 b = 2   <=> a,b,c = 1,2,3 (等价)
 c = 3

多个值可以赋值给一个变量,比如:
d = 1,2,3
print(type(d))
输出结果:<class 'tuple'>
序列解包:
 a,b,c = d
规则:左右个数相同

案例1:
    d = 1,2,3
a,b,c = d
print(b)
输出:2

案例2:
 a = 1
 b = 1  <=> a,b,c = 1,1,1 <=> a=b=c=1
 c = 1
 print(a,b,c) --> 1 1 1

 6.必须参数与关键字参数
   参数类型:
   (1)必须参数
   例如:
    def add(a,b):#a,b是形参(形式参数)

    return a+b

    def print_result(code):
    print(code)

   a = add(1,2)#1,2是实参(实际参数)
   b = print_result('我是一个打印函数')

   (2)关键字参数
    例如:
    def add(a,b):
    return a+b
    a = add(b=1,a=2) #关键字参数(不关心形参的顺序,增强代码可读性)
    小提示:实参与形参的个数相同

   (3)默认参数
     例如:
     def student_list(name,gender='男',age=18,college='无名中学'):
            print('我是'+name)
            print("我今年"+ str(age) + '岁')
            print('我是' +gender + '生')
            print('我在' + college + '上学')

     student_list('小明','男',16,'无名路中学')
     print('--------------------------')
     student_list('小江')
     print('--------------------------')
     student_list('小红','女',16)

   结果:
我是小明
我今年16岁
我是男生
我在无名路中学上学
--------------------------
我是小江
我今年18岁
我是男生
我在无名中学上学
--------------------------
我是小红
我今年16岁
我是女生
我在无名中学上学

  作用:确保函数调用的参数完整性
  规则:1.给参数设定默认值 2.如果参数没有默认值,则为必传参数 3.若要改变默认参数则直接传入相应的参数即可

  一些误点总结:
1.必须把非默认参数放到默认参数后边
2.形参列表和实参列表是一一对应的(默认情况下),若要改变指定的参数则需使用关键字参数指定需要改变的参数(关键             字参数可改变传参顺序)
3.默认参数不能和必须参数混合调用(遵循第一条规则)
比如:
def student_list(name,gender='男',age=18,college='无名中学'):
                print('我是'+name)
                print("我今年"+ str(age) + '岁')
                print('我是' +gender + '生')
                print('我在' + college + '上学')

student_list('小明','男',16,'无名路中学')
print('--------------------------')
student_list('小江')
print('--------------------------')
student_list('小红','女',16)
print('--------------------------')
student_list('小兰',college='知名中学',16,gender='女')#报错位置

    结果:SyntaxError: positional argument follows keyword argument


(4)可变参数

     特点:用*标识为可变参数列表
     例1:
     def demo(*param):
     print(param)
     print(type(param))
     demo(1,2,3,4,5,6,7,8)
     结果:
       (1, 2, 3, 4, 5, 6, 7, 8)
       <class 'tuple'>
      
      例2:
        def demo(*param):
    print(param)
    print(type(param))
a = (1,2,3,4,5,6,7,8)
demo(*a)

   结果:
      (1, 2, 3, 4, 5, 6, 7, 8)
             <class 'tuple'>

       场景:使用列表或者元组等作为参数
       *a的作用:解包
       误点:如果直接传入将返回一个二维元组

       例3:(必需参数、默认参数和可变参数的调用顺序)
       def demo(param1,param2=2,*param):
    print(param1)
    print(param2)
    print(param)
       demo('a',1,2,3)
       结果:a 1 (2, 3)
         
       例4:
        def demo(param1,*param,param2=2):
    print(param1)
    print(param)
    print(param2)
        demo('a',1,2,3,'param')

        结果:a  (1, 2, 3, 'param')  2

        例5:
        def demo(param1, *param, param2=2):
    print(param1)
    print(param)
    print(param2)
        demo('a',1,2,3,param2='param')
        结果:a  (1, 2, 3)  param

        例6:(求平方和)
        def sqrsum(*param):
    sum = 0
    for i in param:
        sum += i*i
    print(sum)
a = (1,2,3,4,5)
sqrsum(*a)
结果:55

      (5)关键字可变参数
        例1:
        def demo(**param):
    print(param)
    print(type(param))
        demo(key1='a',key2='b',key3='c')

        结果:
              {'key2': 'b', 'key1': 'a', 'key3': 'c'}
              <class 'dict'>

        例2:
            def demo(**param):
    for key,value in param.items():
        print(key,':',value)
    demo(key1='a',key2='b',key3='c')

 结果:
        key3 : c
key2 : b
key1 : a
        例3:
           def demo(**param):
    for key,value in param.items():
        print(key,':',value)
a = {'key1':'a','key2':'b','key3':'c'}
demo(**a)

   结果:
key3 : c
key1 : a
key2 : b
            小提示:可变参数列表可以什么都不传

  7.变量作用域
    例1:
        a = 10 #全局变量
def add(x,y):
    a = x + y #局部变量
    print(a)
add(1,2)
        print(a)
    结果:3 10
    原因:a的作用范围不同

    例2:
      def demo():
    a = 10
    for i in range(0,9):
        b = '局部变量测试'
        a += i
    print(a)
    print(b)
      demo()

      结果:46   局部变量测试
      原因:能打印出for循环里的b变量是因为for循环不形成块级作用域

    例3:
        a = 1
def func1():
    a = 2
    def func2():
        a = 3
        print(a)
    func2()
func1()
结果:3
小提示:局部变量具有相对性,具有作用域链的特性,逐级往上找

8. global关键字(将局部变量定义为全局变量)
   例1:
        def demo():
    global c #先定义c为全局变量
    c = 2 #使用c
demo() #调用函数使全局变量生效
print(c)
结果:2
小提示:外部模块调用也可以使用global定义的全局变量

猜你喜欢

转载自blog.csdn.net/q_jimmy/article/details/80545987