欢迎来godlover的博客

生成器,面向过程编程,三元表达式,列表生成式,生成器表达式,匿名函数,内置函数

什么是生成器:

生成器是一个’自定义‘的迭代器,本质是个迭代器

如何实现生成器:

自定义的迭代器

def func():
    print("from func")
    yield 1
    res = func()
    print(res._next_)
    
    
运行结果:from func
    当我们通过_next_取值时才会执行函数体代码

yield:

每一次yield都会往生成器里面添加一个值

只能在函数内部定义

yield可以保存函数的暂停状态

但凡在函数内部定义了的yield,调用函数时函数体代码不会执行,会返回一个结果,该结果就是一个生成器

yield与return的区别:

相同点:

返回值都是无限制的

不同点:

return 只能返回一个值

yield 能返回多个值

python2中:range(1,5) ——————>[1,2,3,4]

python3中:range(1,5) ———————>range对象——————>生成器

创建一个自定义生成器,自定义range功能
def my_range(start,end,move=1):
    while start <end:
        yield start
        start += move

面向过程编程

面向过程编程是一门编程思想

核心是过程 ————————>指的是一种解决问题的步骤一种机械式的思维方式

优点:

将复杂的问题流程化,进而简单化

缺点:

若修改当前程序设计的某一部分,会导致其他部分同时需要修改,拓展性差

# # 1.先让用户输入用户名和密码,用户角色,校验合法性
def get_user_pwd_role():
    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('两次输入的密码不一致!')

    user_role = input('请输入您的用户角色:').strip()

    return username, password, user_role


# # 2.拼接用户字符串
def cut_user_pwd_role(username, password, user_role):
    user_pwd_role_str = f'{username}:{password}:{user_role}\n'
    return user_pwd_role_str, username


# # 3.保存用户数据,写入文件中
def save_data(user_pwd_role_str, username):
    with open(f'{username}.txt', 'w', encoding='utf-8') as wf:
        wf.write(user_pwd_role_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)
#
def register():
    username, password, user_role = get_user_pwd_role()
    user_pwd_role_str, username = cut_user_pwd_role(username, password, user_role)
    save_data(user_pwd_role_str, username)


register()



root:root:普通用户

三元表达式:

可以将 if...else...分支变成一行

语法

条件成立时返回左边的值,if判断条件,else条件不成立时返回右边的值

求两个值的大小:
    def max(num1,num2)
        return num1
    else:
        return num2
    
    
    res = num1 if num1>num2 else num2
    条件成立时,返回左边的值;条件不成立时,返回右边的值
    

列表生成式:

将list中的值,依次取值,添加到new_list中

可以一行实现生成列表

语法:

[值 for 可迭代对象中取出的每一个值 可迭代对象 + if 判断]

for 的右边是循环次数,并且可以取出可迭代对象中的每个值

for的左边可以为当前列表添加值

[line for line in range(1,101)]
[f'1{line}' for line in range(1,101)]

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

​ 生成器生成式:若数据量大时采用

()——————>返回生成器

(lline for line in range(1,6))

优点:节省资源 缺点:取值不便

列表生成式:若数据量小时采用

[line for line in range(1,6)]

缺点:浪费资源 优点:可以依赖索引取值

匿名函数:

无名字的函数 lambda

有名函数:

def func():

pass

匿名(1,return 已经自动添加了)

lamdba 匿名() : return 1

lambda : 1 左边是参数,右边是返回值

需要一次性使用

单独使用将毫无意义,它必须配合内置函数才有意义

内置函数:

python内部提供的内置方法

max,min,sorted

max求最大值 max(可迭代对象)

max内部会通过可迭代对象进行for循环取出,每个值,进行比较

获取dict1中薪资最大的人的名字
dict1={
    'tank'  :100,
    'egon'  :500,
    'sean'  :200,
    'jason' :50
    
}
max(dict1)比较的是ascii中的字符串大小
max(dict1, key=lambda x:dict[x])

sorted

进行 排序

默认升序(从小到大)

reverse 默认是false (从大到小)

将dict1中的名字根据薪资进行排序(由小到大)
sorted(dict1,key=lambda x:dict1[x])
(由大到小)
res = sorted(dict1, key=lambda x: dict1[x],reverse=True)
posted @ 2019-11-14 17:18  godlover  阅读(...)  评论(... 编辑 收藏