一、函数
1、函数的本质
函数的本质就是对功能的封装
2、优点
1)简化代码结构,增加了代码的复用度
2)如果想修改某个功能或者调试某个BUG,还需要修改对应的函数即可
3、定义函数
格式:
def 函数名(函数列表):
语句
return 表达式
def:函数代码块以def关键字开始
函数名称:遵循标识符规则
参数列表:(参数1,参数2,…,参数n):任何传入函数的参数和变量必须放在圆括号之间,用逗号分隔。函数从函数的调用者哪里获取的信息
冒号:函数内容(封装的功能)以冒号开始,并且缩进
语句:函数封装的功能
return:一般用于结束函数,并返回信息给函数的调用者
表达式:即为要返回黑给函数的调用者的信息
注意:最后的return表达式可以不写,相当于return None
4、函数的调用
格式:
函数名(参数列表)
函数名:要使用的的功能的函数的名称
参数列表:函数的调用者给函数传递的信息
5、函数的参数
1)形参
定义函数时,小括号中的变量,本质是变量,参数必须按照顺序传递,个数要对应
def myPrint(str,age):
print(str,age)
2)实参
调用函数时给函数传递的数据,本质是值
值传递:传递的不可变类型
string,tuple,number是不可变的
myPrint("haha is a test girl",15)
def func1(num):
num = 10
temp = 20
func1(temp)
print(temp)
20
3)引用传递
传递的可变类型
list、dict、set是可变的
4)关键字参数
允许函数调用时参数的顺序与定义时的不一致
def myPrint(str,age):
print(str,age)
myPrint(age = 18,str = "haha is a test girl")
haha is a test girl 18
5)默认参数
调用函数时,如果没有传递参数,则使用默认的参数
def myPrint(str,age = 18):
print(str,age)
myPrint("haha")
haha 18
要用默认参数,最好将默认参数放到最后
6)不定长参数
#加了星号(*)的变量存放所有未命名的变量参数,如果在函数调用时没有指定参数,它就是一个空元组
def func(name,*arr):
print(name)
print(type(arr))
for x in arr:
print(x)
func("hah","is","test","a","good","girl")
hah
<class 'tuple'>
is
test
a
good
girl
def mySum(*l):
sum = 0
for i in l:
sum += i
return sum
print(mySum(1,2,3,4,5))
15
**代表键值对的参数字典,和*所代表的意义类似
def func2(**kwargs):
print(kwargs)
print(type(kwargs))
fun2c(x=1, y=2, z=3)
{'x': 1, 'y': 2, 'z': 3}
<class 'dict'>
def func3(*args, **kwargs):
pass # 代表 一个空语句
6、匿名函数
概念:不使用def这样的语句来定义函数,使用lambda来创建匿名函数
特点:
1)lambda只是一个表达式,函数体比def简单
2)lambda的主体是一个表达式,而不是代码块,仅仅只能在lambda表达式中封装简单的逻辑
3)lambda函数有自己的命名空间,且不能访问自有参数之外的或全局命名空间的参数
4)虽然lambda是一个表达式且看起来只能写一行,与C和C++的内联函数不同
格式:
lambda 参数1,参数2,......,参数n:expression
sum = lambda num1,num2:num1+num2
print(sum(1,2))
3
二、装饰器
是一个闭包,把一个函数当做参数返回一个替代版的函数,本质上是一个返回函数的函数
1.简单的装饰器
def func1():
print("hah is a test girl")
def outer():
print("**************")
func1()
outer()
**************
hah is a test girl
def say(age):
print("hah is %d test girl" % (age))
def outer(func):
def inner(age):
if age < 0:
age = 0
func()
return inner
say = outer(say) (或者是使用:@outer)
say(-10)
hah is 0 test girl
2.通用装饰器
def say(age):
print("haha is %d years old" % (age))
def outer(func):
def inner(*args, **kwargs):
print("&&&&&&&&&&&&&&&")
func(*aegs, **kwargs)
return inner
@outer
def say(name, age):
print("my name is %s, I am %d years old" % (name,age))
say("haha", 18)
&&&&&&&&&&&&&&&
my name is haha, I am 18 years old
备注:函数的参数理论上可以是无限制的,但是实际上最好不要超过6,7个
三、偏函数
def int2(str,base = 2):
return int(str,base)
print(int2("1011"))
11 #以二进制形式打印
把一个参数固定住,形成一个新的函数
import functools
int3 = functools.partial(int,base = 2)
print(int3("111"))
7
四、变量的作用域
1.作用域:
变量可以使用的范围
程序的变量并不是所有位置都能使用的,访问的权限决定于变量在哪里赋值的
2.类型:
局部作用域
全局作用域
内建作用域