有参装饰器
def login_auth(func):
def wrapper(func):
def inner(*args, **kwargs):
res = func(*args, **kwargs)
return res
return inner
return wrapper
@login_auth('vip用户')
def index():
pass
无参装饰器
def wrapper(func):
def inner(*args,**kwargs):
res = func(*args, **kwargs)
return res
return inner
@wrapper
def index():
pass
生成器
生成器的本质:yield生成器是自定义的迭代器,本质是迭代器
生成器的定义:在函数体自定义yield,调用函数时函数体内代码不会执行,当通过__next__()取值时才会执行函数体内代码,并且yield会返回一个结果(可以返回多次);
yield的特点: 1.yield只能在函数体内定义 2.每次都往生成器添加一个值 3.可以保持暂停状态
yield和return的区别:
相同点:都有返回值
不同点:return只能返回一次值(一次值可以是空,一个,多个),yield一次只能返回一个值,但可以返回多次。
演练
list1 = [1, 2, 3, 4]
list = list1.__iter__()
print(list.__next__())
通过__next__()取值才会执行函数体内代码
def func():
print('from func')
yield 'tank'
print(func().__next__())
def func():
yield 1
yield 2
yield 3
yield 4
yield 5
yield 6
res = func()
__next__()直接通过func()取值,只能取第一个,必须通过func()对象res才能实现迭代全部
print(res.__next__())
......
print(res.__next__())
迭代器内部自动优化stopiteration报错
def range_me(start, end, move=1):
while start < end:#
yield start#
start += move#
res = range_me(1,5)
for line in res:
print(line)
for line in range_me(1,5,1):
print(line)
面向过程编程
面向过程编程自白:面向过程编程核心是’过程’二字,类似工厂流水线,即先做什么后做什么。
优点: 复杂的问题流程化、简单化。
缺点: 可扩展性差,牵一发而动全身。
def get_user_pwd():
while True:
username = input('请输入用户名:').strip()
if username.isalpha():
break
else:
print('名字不合法')
while True:
password = input('请输入密码').strip()
re_password = input('请确认密码').strip()
if password == re_password:
break
else:
print('两次密码不一致')
return username, password
def cut_user_pwd(user,pwd):
user_pwd_str = f'{user}:{pwd}
'
return user_pwd_str
def save_data(user_pwd_str):
with open('user.txt','a',encoding='utf8') as f:
f.write(user_pwd_str)
def register():
user,pwd = get_user_pwd()
user_pwd_str = cut_user_pwd(user,pwd)
save_data(user_pwd_str)
register()
三元表达式
将if…else分支变成一行
语法:条件成立if返回左边的值,else不成立返回右边的值。
num1 = 10
num2 = 20
res = num1 if num1 > num2 else num2
print(res)
def max1(num1,num2):
res = num1 if num1 < num2 else num2
return res
res = max1(10,20)
print(res)
username = input('请输入用户名:').strip()
new_username = username if username == 'lipeng' else username+'dsb'
print(new_username)
列表生成式
list = [值 for 可迭代对象中取出的每一个值 in 可迭代对象]
优点:可以依赖索引取值,取值方便
缺点:浪费资源
普通方式
list = [1,2,3,4]
new_lsit = []
for line in list:
new_lsit.append(line)
print(new_lsit)
列表生成式
list1 = [f'{line}' for line in range(1,23)]
print(list1)
list1 = ['nick','tank','seaon']
list = [ line + 'dsb' for line in list1]
print(list)
生成器表达式
优点:节省资源
缺点:取值不方便
#为了节省空间连打印都不给显示了
g = (line for line in range(1,1000))
print(next(g))
结果:<generator object <genexpr> at 0x000001839FDB0E08>
匿名函数
没有名字的函数,左边是参数,右边是返回值lambda:1
因为没有名字,所以没有调用方法;
匿名函数需要一次性使用,和内置函数更配哦。(单身狗是可耻的)
内置函数
range()、print()、len()等都是属于内置函数python内部提供的内置方法
max, min, sorted, map, filter
sorted 对可迭代对象进行排序 后面加reverse=true进行倒序排列