列表生成式

 

生成器

1:什么是生成器?
生成的工具
生成器是一个“自定义”的迭代器,本质上是一个迭代器
2:如果实现生成器
单反在函数内部定义了yield
调用函数时,函数体代码不会执行
会返回一个结果,该结果就是一个生成器
yield:
每一次yield都会往生成器对象中添加一个值
yield只能在函数内部定义
yield可以保存函数的暂停状态
yield与return:
相同点:返回值的个数都是无限制的
不同点:return只能返回一次值,yield可以返回多个值
 
# 可迭代对象
list1 = [1, 2, 3, 4.]
 
 
# 迭代器对象 python内置生成的迭代器
iter_list = list1.__iter__()
print(iter_list)
 
 
<list_iterator object at 0x000002C8661A8188>
自定义的迭代器
 
def func():
    print('from func')
    yield 'tank'
 
 
 
 
res = func()
# 当我们通过__next__取值时,才会执行函数体代码。
print(res.__next__())
 
 
def func():
    print('开始准备下蛋')
    print('1---火鸡蛋')
    yield '火鸡蛋1'
    print('2---火鸡蛋')
    yield '火鸡蛋2'
    print('3---火鸡蛋')
    yield '火鸡蛋3'
 
 
    print('取最后一个蛋,查看是否有')
 
 
 
 
res = func()
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
 
 
Traceback (most recent call last):
  File "C:/Users/ever/PycharmProjects/untitled/oldboy/正式开班/day13/生成器.py", line 16, in <module>
开始准备下蛋
    print(res.__next__())
1---火鸡蛋
StopIteration
火鸡蛋1
2---火鸡蛋
火鸡蛋2
3---火鸡蛋
火鸡蛋3
取最后一个蛋,查看是否有
自定义range功能,创建一个自定义的生成器
 
def my_range(start, end, move=1):
    while start < end:
        yield start
        start += move
 
 
 
 
for line in my_range(1, 5, 2):
    print(line)
    
    1
    3
 

面向过程编程

思想!!!
面向过程编程是一门编程思想
面向过程编程:
核心是“过程”二字,过程指的是一种解决问题的步骤,即先干什么再干什么
基于该编程思想编写程序,就好比在一个设计一条工厂流水线,一种机械式的思维模式
优点:将复杂的问题流程化,进而简单化
缺点:若修改当前程序设计的某一部分,会导致其他部分同时需要修改,扩展性差。
牵一发而动全身,扩展性差
实例:
 
# 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()
 
 
请输入用户名:tank
请输入密码:123
请确认密码:123
    
查看文件会有创建数据
ever:123
tank:123
添加一个功能,发现可扩展性差
 
# 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('两次密码不一致。')
 
 
    # 作业: 保证用户输入的角色范围 [普通用户、管理员用户、超级用户]
    user_role = input('请输入用户角色:').strip()
 
 
    return username, password, user_role
 
 
 
 
# 2.拼接用户字符串
def cut_user_pwd(user, pwd, user_role):
    user_pwd_str = f'{user}:{pwd}:{user_role}\n'
    return user_pwd_str, user
 
 
 
 
# user = 'tank'
# user_name = user
 
 
# 3.保存用户数据,写入文件中
# 每一个用户保存一个文件,以用户的名字当做文件名
def save_data(user_pwd_str, user_name):
    with open(f'{user_name}.txt', 'w', encoding='utf-8') as f:
        f.write(user_pwd_str)
 
 
 
 
# 注册功能Demo
def register():
    # 1.设计先让用户输入用户名和密码,校验合法性,得到合法的用户名与密码
    user, pwd, user_role = get_user_pwd()
 
 
    # 2.设计字符串的拼接, 得到拼接好的字符串
    user_pwd_str, user_name = cut_user_pwd(user, pwd, user_role)
 
 
    # 3.开始写入文件
    save_data(user_pwd_str, user_name)
 
 
 
 
register()
 
 
 
 
请输入用户名:liuxuan
请输入密码:123
请确认密码:123
请输入用户角色:普通用户
    
    
查看文件会生成用户名命名的文件
liuxuan:123:普通用户
 

三元表达式

可以将if ...else...分支变成一行
语法:条件成立返回左边的值if判断条件else条件不成立返回右边的值
常规的模式
if 判断条件:
执行
else:
执行
求两个值的大小
通过if...else
 
def max2(num1, num2):
    if num1 > num2:
        return num1
    else:
        return num2
 
 
 
 
res = max2(10, 20)
print(res)
 
 
20
def max2(num1, num2):
    if num1 > num2:
        return num1
    else:
        return num2
 
 
 
 
res = max2(100, 20)
print(res)
 
 
100
用三元表达式求
 
num1 = 10
num2 = 20
 
 
 
 
def max2(num1, num2):
    res = num1 if num1 > num2 else num2
    return res
 
 
 
 
res = max2(num1, num2)
print(res)
 
 
20
需求: 让用户输入用户名,输入的用户如果不是tank,为其后缀添加_DSB
 
username = input('请输入用户名:').strip()
new_username = username if username == 'tank' else username + '_DSB'
print(new_username)
 
 
请输入用户名:hcy
hcy_DSB
 

列表生成式:

可以一行实现生成列表
语法:
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 range(1, 11):
    new_list.append(line)
print(new_list)
 
 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Demo: 将name_list列表中的每一个人后缀都添加_dsb
 
name_list = ['jason', '饼哥(大脸)', 'sean', 'egon']
new_name_list = [name + '_dsb' for name in name_list]
print(new_name_list)
 
 
['jason_dsb', '饼哥(大脸)_dsb', 'sean_dsb', 'egon_dsb']
将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
      
['jason_dsb', '饼哥(大脸)_dsb', 'sean_dsb', 'egon_dsb']
 

生成器表达式(生成器生成式)

列表生成式:若数据量小时采用
[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)
优点:节省资源
缺点:取值不方便
生成一个有100个值得生成器
 
g = (line for line in range(1, 1000001))
# <generator object <genexpr> at 0x00000203262318E0>
print(g)
 
 
<generator object <genexpr> at 0x000001BB0E0D5248>
列表生成式实现
 
list1 = [line for line in range(1, 11)]
print(list1)
 
 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 

匿名函数:

无名字的函数
lambda :
:左边是参数,右边是返回值
ps:原因,因为没有名字,函数的调用 函数名 + ()
匿名函数需要一次性使用
注意:匿名函数单独使用毫无意义,它必须配合“内置函数”一起使用的才有意义
有名函数:
有名字的函数
有名函数
 
def func():
    return 1
 
 
 
 
print(func())  # func函数对象 + ()
print(func())
匿名函数
 
def  ():
    pass
 
 
()  #  + ()
匿名(), return 已经自动添加了
lambda 匿名():return 1
 
func = lambda : 1
print(func())
 
 
func = lambda : 1
print()
 

内置函数

range()
print()
len()
python 内部提供的内置方法
max,min,sorted,map,filter
sorted:对可迭代对象进行排序
max求最大值 max(可迭代对象
 
list1 = [1, 2, 3, 4, 5]
# max 内部会将list1中通过for取出每一个值,并且进行判断
print(max(list1))
 
5
获取dict1中薪资最大的人的名字
 
dict1 = {
    'tank': 1000,
    'egon': 500,
    'sean': 200,
    'jason': 500
}
print(max(dict1, key=lambda x: dict1[x]))
 
 
tank
获取dict1中薪资最小的人的名字
 
dict1 = {
    'tank': 1000,
    'egon': 500,
    'sean': 200,
    'jason': 500
}
print(min(dict1, key=lambda x: dict1[x]))
 
 
sean
 
sorted:默认升序(从小到大)reverse:反转 reverse 默认是False
 
list1 = [10, 2, 3, 4, 5]
print(sorted(list1))
 
 
[2, 3, 4, 5, 10]
reverse=True--> 降序
 
list1 = [10, 2, 3, 4, 5]
print(sorted(list1, reverse=True))
 
 
[10, 5, 4, 3, 2]
 
dict1 = {
    'tank': 100,
    'egon': 500,
    'sean': 200,
    'jason': 50
}
# new_list = ['egon', 'sean', 'tank', 'jason']
new_list = sorted(dict1, key=lambda x: dict1[x], reverse=True)
print(new_list)
 
 
['egon', 'sean', 'tank', 'jason']
 
 
 
 
 

 

posted on 2019-11-14 20:33  Everuse  阅读(228)  评论(0编辑  收藏  举报

导航