zoukankan      html  css  js  c++  java
  • 列表生成式

    生成器

    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} '
        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} '
        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']
     
     
     
     
     
  • 相关阅读:
    开博说两句
    学习总结 (持续更新)
    ip代理 120203
    [vs2005]关于预编绎网站的问题[已预编译此应用程序的错误]
    JAVA类基础
    集合类和泛型
    IO流——字符流
    多线程和包
    多态和内部类
    抽象类与接口
  • 原文地址:https://www.cnblogs.com/everuse/p/11861847.html
Copyright © 2011-2022 走看看