目录
1、函数的结构
def funcname(parameter_list),函数体需要缩进
- 参数列表可以没有;
- 函数体里可以使用return来返回结果;如果没有return这个关键字,则Python认为该函数返回的是None这样一个空值。
2、函数的几个特点
- 函数定义后,必须要调用这个函数,才能起作用。
- 调用必须放在函数定义之后,不能在之前。
- 系统默认995次递归,超出则报错。可用import sys, sys.setrecursionlimit(1000000)来设定递归次数;实际上达不到百万次的递归。
- 定义函数或变量时,尽量避免和Python的内置函数同名。
3、函数返回多个结果
1、return 后面的语句不会执行/2.
2、用序号显示返回结果是非常不好的习惯
3、好的方式是:用俩个变量来接收返回结果
def A(a1,b1):
first = a1
second = b1
return a1,b1
a2,b2 = A(3,6)
print(a2,b2)
4、序列解包
- a=1,b=2,c=3 可以写为 a,b,c=1,2,3 序列解包的方法可以用于所有组合,字典中只会返回KEY. 需要注意的是,变量的数量,必须和组合内元素的数量一致,才可以使用序列解包。
- d=1,2,3 d=(1,2,3) d就会变成一个tuple类型,这个是反向解包,反向解包只能生产元祖。如果对多个变量赋予相同的值,可以用链式赋值, a=b=c=1
5、参数
1)必须参数:
函数的参数列表中定义的必须赋值的参数。必须放在参数列表的前面。
2)关键字参数:
可以在函数调用时明确指出实参是传给哪个形参的,不一定要按照形参顺序。如:
def add(x, y):
...
return result
c = add(y = 3, x = 2)
3)默认参数:
没有设置默认值的参数必须传递实参。
- 想让参数拥有默认值,就需要将需要的默认值赋值给形参,在定义时需要注意到的点
- 没没有给形参传递默认值,则需要传递实参
注意的坑:
- 不能将非默认参数放置在默认参数之后,不论定义与调用
- 如果想让某一个特定参数传递参数应该使用关键字指定要改变的默认参数否则将会根据默认参数的顺序进行传递
- 在传递默认参数时,不可以将关键字参数传递与按顺序传递的方式穿插混用
4)可变参数。
- 定义一个拥有可变参数的函数: 括号内形参前加星号*
- Python会自动把可变参数列表所对应的实参组装成一个tuple;
- 调用时直接传元组,则返回的结果是一个二维元组;若不想形成二维数组,调用时可以使用*,它将把元组里的元素平铺传递给函数。此时,*的作用是把元组里面的元素平铺出来,传递给函数;
- 可变参数可以和其他类型参数结合记起来。如可以在定义时加上必须参数,但可变参数必须要放在后面;
- 函数参数的顺序是,必须参数、可变参数,默认参数必须在最后;当需更改默认参数值,必须用关键字参数给默认参数赋值;
- 尽量保证函数参数的种类简单
如:
def demo(*param):
print(param)
print(type(param))
demo(1,2,3,4,5)
'''
结果为:
1,2,3,4,5
tuple类型
也就是说python会自动将可变参数对应的实参转化成tuple类型。
'''
5)关键字可变参数
格式:
def demo(**param):
pass
这样在调用时可以传递多个关键字参数,此时python会将其转化为字典类型dict。若还想传递字典类型而不转化为多维数组,调用时需加上**。
小技巧:
遍历字典类型数据方法:
for key,value in param.items():
print(key, ':', value)
6、作用域链
- 局部变量会在作用域内被优先使用;
- 局部变量具有相对性。如c=2这个变量在func1()函数中是局部变量,但对func2()函数来说,却是它的上一级,因此不是局部变量,可以被func2()来引用;
- 逐层逐级向外寻找变量的定义,很像一个链条,因此作用域有链式的特性;
- 如果是for循环向函数体内寻找变量,算作用域链吗?不算。原因是for循环体不是一个作用域,它对循环体外变量的调用属于函数体内变量调用的正常行为。
7、global关键字
作用:在函数外部引用函数内部变量,即把局部变量变成函数外部可引用的变量。
def demo():
global c
c = 2
demo()
print(c)
注:import 导入模块后可以使用模块的全局变量。