zoukankan      html  css  js  c++  java
  • 生成器,面向过程编程,三元表达式,列表生成式,生成器表达式,匿名函数,内置函数

    什么是生成器:

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

    如何实现生成器:

    自定义的迭代器

    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}
    '
        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)
    
    
  • 相关阅读:
    27. Remove Element
    列表变成字典
    1. Two Sum
    CVPR2019:What and How Well You Performed? A Multitask Learning Approach to Action Quality Assessment
    959. Regions Cut By Slashes
    118. Pascal's Triangle
    loj3117 IOI2017 接线 wiring 题解
    题解 NOI2019 序列
    题解 省选联考2020 组合数问题
    题解 Educational Codeforces Round 90 (Rated for Div. 2) (CF1373)
  • 原文地址:https://www.cnblogs.com/godlover/p/11858736.html
Copyright © 2011-2022 走看看