学习视频地址:https://www.bilibili.com/video/BV15J411T7WQ?p=91
P91 函数
调用函数直接输入函数名就行
P94-97 : 参数
无参数函数:
def func () :
pass
func() ------> 调用
有参数函数:
1. 普通参数
def func(name,age):
pass
func func ('aa',18) --------> 形参与实参的个数要一致
2.可变参数
A. def func(*args):
pass
func() ------> 函数调用时,实参的个数可以没有,也可以多个, *不能是关键字参数
func(4)
func(5,'h')
B. def func(**kwargs):
pass
func (a=1,b=2) ------->函数调用时,实参的个数可以没有,也可以多个, **必须是关键字参数
C. def func(*args,**kwargs):
pass
list1 = [1,3,6,7,9]
dict1 = ['1','a','2','b']
func(*list1)
func(*list1,**dict1) #func (1,3,'1'='a','2'='b')
D. 混用
def func(name,*args,**kwargs):
pass
func ('tom') --------> 必须赋值
3.默认值
def func(name,age=18):
pass
func('tom') ------------> tom 18
例:
def func(a, *args):
print(a, args)
func(2, 3, 4, 5)
func(2, [1, 2, 3, 4])
func(2, 3, [1, 2, 3, 4, 5])
func(5, 6, [4, 5, 6], 9)
结果:
2 (3, 4, 5)
2 ([1, 2, 3, 4],)
2 (3, [1, 2, 3, 4, 5])
5 (6, [4, 5, 6], 9)
def func1(a, b=10, c=3, **kwargs):
print(a, b, c, kwargs)
func1(1)
func1(2, b=10)
func1(3, 5, 7, x=1, y=2)
结果:
1 10 3 {}
2 10 3 {}
3 5 7 {'x': 1, 'y': 2}
def func2(a, *args, **kwargs):
print(a, args, kwargs)
t = (1, 2, 3, 4)
func2(1, t)
l = [2, 5, 8]
func2(1, l, c=9, b=6)
dict1 = {'1': 'a', '2': 'b', '3': 'c'}
func2(1, *l, **dict1)
结果:
1 ((1, 2, 3, 4),) {}
1 ([2, 5, 8],) {'c': 9, 'b': 6}
1 (2, 5, 8) {'1': 'a', '2': 'b', '3': 'c'}
函数中能调用函数:
例:购物车案例
islogin = False
def add_shoppingcart(goodsName):
global islogin
if islogin:
if goodsName:
print('{}成功加入购物车!'.format(goodsName))
else:
print('没有选中任何商品!')
else:
answer = input('没有登陆,是否登陆。(yes/no)')
if answer == 'yes':
username = input('请输入用户名:')
passward = input('请输入密码:')
islogin = login(username, password) # 函数中能掉函数
add_shoppingcart('迪奥999')
else:
print('不能添加此商品')
def login(username, password):
if username == 'nannan' and password == '123456':
return True
else:
return False
username = input('请输入用户名:')
password = input('请输入密码:')
islogin = login(username, password)
add_shoppingcart('迪奥999')
函数嵌套
例:验证码登陆
import random
def generate_checkcode(n):
s = '0123456789qwertyuioplkjhggfdsazxcvbnm'
code = ''
for i in range(n):
ran = random.randint(0,len(s)-1)
code += s[ran]
return code
def login():
username = input('请输入用户名:')
password = input('请输入密码:')
code = generate_checkcode(5)
print('验证码是:',code)
code1 = input('请输入验证码:')
if code.lower() == code1.lower():
if username == 'nannan' and password == '123456' :
print('用户登陆成功')
else:
print('用户名密码错误')
else:
print('输入的验证码错误')
login ()
P101-P102 全局变量和局部变量
全局变量如果是不可变在函数中进行修改需要添加global关键字,
如果全局变量是可变的,在函数中修改的时候就不需要添加gobal
P104 - 105 内部函数
1.可以访问外部函数的变量
2.内部函数可以修改外部函数的可变类型的变量比如:list1
3.内部函数修改全局的不可变量时,需要在内部函数声明global 变量名
内部函数修改外部函数的不可变的变量时,需要在内部函数中声明:nonlocal 变量名
4.locals() 查看本地变量有哪些,以字典的形式输出
globals() 查看全局变量有哪些,以字典的形式输出(注意里面会有一些系统的键值对)
例:
a = 100
def func():
b = 99
def inner_func():
global a
nonlocal b
c = 88
# 尝试修改
c += 12
b += 1
a += 10
# 尝试打印
print(a, b, c)
inner_func()
func()
P106-109 闭包
闭包多用于函数。
条件:
1.外部函数中定义了内部函数
2.外部函数是有返回值
3.返回的值是:内部函数名
4.内部函数引用了外部函数的变量
格式:
def 外部函数():
…
def 内部函数():
…
retunrn 内部函数
例:
# 闭包
def func(a, b):
c = 10
def inner_func():
s = a + b + c
print('相加之后的结果是:', s)
return inner_func
# 调用func
ifunc = func(6, 9) # ifunc 就是 inner_func ifunc = inner_func
# 调用返出来的
ifunc()
结果:
相加之后的结果是: 25
闭包计数器
# 计数器
def generate_count():
container = [0]
def add_one():
container[0] = container[0] + 1
print('当前是第{}次访问'.format(container[0]))
return add_one
counter = generate_count()
counter()
counter()
counter()
结果:
当前是第1次访问
当前是第2次访问
当前是第3次访问
闭包能保持参数
P110 装饰器
特点:
1.函数A是作为参数出现的(函数B就接受函数A作为参数)
2.要有闭包的特点
定义一个装饰器:
万能的装饰器:
def decorate (func):
def wrapper(*args,**kwargs):
pass
return wrapper
@decorate
多层装饰器:
带参数的装饰器:
1.带参数的装饰器是三层的
2.最外层的函数负责接收装饰器的参数
3.里面的内容还是和原装饰器的内容
例:
装饰器应用实例:
import time
islogin = False
def login():
username = input('请输入用户名:')
password = input('请输入密码:')
if username == 'nannan' and password == '123':
return True
else:
return False
def login_requir(func):
def wrapper(*args, **kwargs):
global islogin
if islogin:
func(*args, **kwargs)
else:
print('没有登陆')
islogin = login()
print('登陆结果:', islogin)
return wrapper
@login_requir
def pay(money):
print('正在支付{}元'.format(money))
print('..........')
time.sleep(2)
print('支付成功!')
pay(10000)
pay(8000)
P115函数作用域:LEGB
L : local 本地 局部变量
E:encloseing 嵌套
G:global 全局
B:built-in 内置的
P116 匿名函数: 简化函数定义
格式: lambda 参数1,参数2,:运算
def add(a,b) :
s = a + b
return s
s = lambda a, b : a+b
匿名函数作为参数
结果:[4 , 4 , 6 , 8 , 8 , 10 , 10 , 0 , 2 , 6 ]
P117 内置函数; filter sorted reduce
注:函数中带key 的使用