第十三天(都是理论)
无参装饰器模板、有参装饰器模板
# 无参装饰器模板
def wrapper(func):
def inner(*args, **kwargs):
res = func(*args, **kwargs)
# 在被装饰对象调用后添加功能
return res
return inner
# 有参装饰器模板
def outer(arg):
def wrapper(func):
def inner(*args, **kwargs):
res = func(*args, **kwargs)
return res
return inner
return wrapper
生成器
生成器就是生成的工具
是一个‘自定义的‘迭代器,本质上是一个迭代器
如何实现生成器
单反在函数内部定义了yield,调用函数时,
函数体代码不会执行,会返回一个结果,该结果就是一个生成器
yield:
每一次yield都会网生成器对象中添加一个值。
yield只能在函数内部定义
yield可以保存函数的暂停状态
yield与return:
相同点:返回的个数都是无限制的
不同点:return只能返回一个值,yield可以返回多个值
# 自定义生成器
# def func():
# print('hello world')
# yield 'jinyi'
# res = func()
面向过程编程
'''
思想!!!
面向过程编程是一门编程思想。
面向 过程 编程:
核心是 '过程' 二字,过程 指的是一种解决问题的步骤,即先干什么再干什么
基于该编程思想编写程序,就好比在设计一条工厂流水线,一种机械式的思维方式。
优点:
将复杂的问题流程化,进而简单化
缺点:
若修改当前程序设计的某一部分, 会导致其他部分同时需要修改, 扩展性差。
牵一发而动全身,扩展性差。
'''
# # 1.先让用户输入用户名和密码,校验合法性
# def get_user_pwd():
# while True:
# # 让用户输入用户名与密码
# username = input('请输入用户名:').strip()
# # 校验用户名是否为 英文字母 str.isalpha 校验英文字母、中文
# 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
#
#
# # 2.拼接用户字符串
# def cut_user_pwd(user, pwd):
# user_pwd_str = f'{user}:{pwd}\n'
# return user_pwd_str
#
#
# # 3.保存用户数据,写入文件中
# def save_data(user_pwd_str):
# with open('user.txt', 'a', encoding='utf-8') as f:
# f.write(user_pwd_str)
#
#
# # 注册功能Demo
# def register():
# # 1.设计先让用户输入用户名和密码,校验合法性,得到合法的用户名与密码
# user, pwd = get_user_pwd()
#
# # 2.设计字符串的拼接, 得到拼接好的字符串
# user_pwd_str = cut_user_pwd(user, pwd)
#
# # 3.开始写入文件
# save_data(user_pwd_str)
#
#
# register()
三元表达式
'''
三元表达式:
可以将if...else...分支变成一行。
语法:
条件成立返回左边的值 if 判断条件 else 条件不成立返回右边的值
'''
# if 判断条件:
# 执行
# else:
# 执行
# 求两个值的大小
# 通过if...else语法
# def max2(num1, num2):
#
# if num1 > num2:
# return num1
# else:
# return num2
#
# res = max2(100, 20)
#
# print(res)
# 三元表达式
# num1 = 10
# num2 = 20
# # res = num1 if num1 > num2 else num2
# def max2(num1, num2):
# res = num1 if num1 > num2 else num2
# return res
#
# res = max2(num1, num2)
# print(res)
列表生成式
'''
列表生成式:
可以一行实现生成列表。
语法:
list = [取出的每一个值、任意值 for 可迭代对象中取出的每一个值 in 可迭代对象]
# for的右边是循环次数,并且可以取出可迭代对象中每一个值
# for的左边可以为当前列表添加值
list = [值 for 可迭代对象中取出的每一个值 in 可迭代对象]
list = [值 for 可迭代对象中取出的每一个值 in 可迭代对象 if 判断]
'''
# 将list1中的值,依次取出,添加到new_list中
# list1 = [1, 2, 3, 4]
# new_list = []
# for line in list1:
# new_list.append(line)
#
# print(new_list)
# 普通方式
# new_list = []
# for line in range(1, 101):
# new_list.append(line)
# print(new_list)
# 列表生成式
# list1 = [f'1{line}' for line in range(1, 101)]
# print(list1)
# Demo: 将name_list列表中的每一个人后缀都添加_dsb
# name_list = ['jason', '饼哥(大脸)', 'sean', 'egon']
# new_name_list = [name + '_dsb' for name in name_list]
# print(new_name_list)
# 将name_list列表中的tank过滤掉,其他人后缀都添加_dsb
# name_list = ['jason', '饼哥(大脸)', 'sean', 'egon', 'tank']
# new_name_list = [name + '_dsb' for name in name_list if not name == 'tank']
# print(new_name_list)
# 只要思想不滑坡,方法总比问题多。
生成器表达式(生成器生成式)
'''
生成器表达式(生成器生成式):
- 列表生成式: 若数据量小时采用
[line for line in range(1, 6)] ---> [1, 2, 3, 4, 5]
优点:
可以依赖于索引取值,取值方便
缺点:
浪费资源
- 生成器生成式: 若数据量过大时采用
() ---> 返回生成器
(line for line in range(1, 6)) ---> g生成器(1, 2, 3, 4, 5)
优点:
节省资源
缺点:
取值不方便
'''
# 生成一个有1000个值的生成器
g = (line for line in range(1, 1000001))
# <generator object <genexpr> at 0x00000203262318E0>
print(g)
# 列表生成式实现
list1 = [line for line in range(1, 1000001)]
print(list1)
匿名函数
'''
生成器表达式(生成器生成式):
- 列表生成式: 若数据量小时采用
[line for line in range(1, 6)] ---> [1, 2, 3, 4, 5]
优点:
可以依赖于索引取值,取值方便
缺点:
浪费资源
- 生成器生成式: 若数据量过大时采用
() ---> 返回生成器
(line for line in range(1, 6)) ---> g生成器(1, 2, 3, 4, 5)
优点:
节省资源
缺点:
取值不方便
'''
# 生成一个有1000个值的生成器
g = (line for line in range(1, 1000001))
# <generator object <genexpr> at 0x00000203262318E0>
print(g)
# 列表生成式实现
list1 = [line for line in range(1, 1000001)]
print(list1)
内置函数
'''
生成器表达式(生成器生成式):
- 列表生成式: 若数据量小时采用
[line for line in range(1, 6)] ---> [1, 2, 3, 4, 5]
优点:
可以依赖于索引取值,取值方便
缺点:
浪费资源
- 生成器生成式: 若数据量过大时采用
() ---> 返回生成器
(line for line in range(1, 6)) ---> g生成器(1, 2, 3, 4, 5)
优点:
节省资源
缺点:
取值不方便
'''
# 生成一个有1000个值的生成器
g = (line for line in range(1, 1000001))
# <generator object <genexpr> at 0x00000203262318E0>
print(g)
# 列表生成式实现
list1 = [line for line in range(1, 1000001)]
print(list1)