生成器

1.什么是生成器?
  生成的工具。
  生成器是一个 "自定义" 的迭代器, 本质上是一个迭代器。

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

yield:
  每一次yield都会往生成器对象中添加一个值。
  - yield只能在函数内部定义
  - yield可以保存函数的暂停状态

yield与return:
  相同点:
    返回值的个数都是无限制的。

  不同点:
    return只能返回一次值,yield可以返回多个值,默认是元组,可以修改返回类型

自定义的迭代器
def func():
print('开始准备下蛋')
print('1---火鸡蛋1')
yield '火鸡蛋1'
print('2---火鸡蛋2')
yield '火鸡蛋2'
print('3---火鸡蛋3')
yield '火鸡蛋3' print('取最后一个蛋,查看是否有') res是迭代器对象
res = func()
当我们通过__next__取值时,才会执行函数体代码。
next(迭代器对象)
print(next(res))
print(next(res))
print(next(res)) 迭代器对象.__next__()
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__()) # StopIteration报错

自定义range功能,创建一个自定义生成器

# 循环10次
# for i in range(1, 11):
# # print(i) # 1—10 # python2: range(1, 5) ---> [1, 2, 3, 4]
# python3: range(1, 5) ---> range对象 ---> 生成器 ---> 迭代器
# res = range(1, 5)
# print(res) # 自定义range功能,创建一个自定义的生成器
# (1, 3) # start--> 1 , end---> 5, move=2
def my_range(start, end, move=1): #
while start < end:
yield start
start += move # g_range = my_range(1, 5)
# print(g_range)
#
# for line in g_range:
# print(line) for line in my_range(1, 5, 2):
print(line)

面向过程编程

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

面向 过程 编程:
  核心是 '过程' 二字,过程 指的是一种解决问题的步骤,即先干什么再干什么
  基于该编程思想编写程序,就好比在设计一条工厂流水线,一种机械式的思维方式。

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

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

    牵一发而动全身,扩展性差。

三元表达式

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

  语法:
    条件成立返回左边的值 if 判断条件 else 条件不成立返回右边的值

def max2(num1, num2):
res = num1 if num1 > num2 else num2
return res res = max2(3, 2)
print(res) # 需求: 让用户输入用户名,输入的用户如果不是tank,为其后缀添加_DSB
username = input('请输入用户名:').strip()
new_username = username if username == 'tank' else username + '_DSB'
print(new_username)

列表生成式

  可以一行实现生成列表。
  语法:
    list = [取出的每一个值、任意值 for 可迭代对象中取出的每一个值 in 可迭代对象]
    # for的右边是循环次数,并且可以取出可迭代对象中每一个值
    # for的左边可以为当前列表添加值
    list = [值 for 可迭代对象中取出的每一个值 in 可迭代对象]

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

# 列表生成式
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)
#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10...]

匿名函数:

  无名字的函数
  # :左边是参数, 右边是返回值
  lambda :

  PS: 原因,因为没有名字,函数的调用 函数名 + ()
  匿名函数需要一次性使用。
  注意: 匿名函数单独使用毫无意义,它必须配合 “内置函数” 一起使用的才有意义。

有名函数:
  有名字的函数

func = lambda x,y:x if x > y else y
print(func(2,6)) # calc = lambda x,y:x**y
print(calc(2,5)) #
#按年龄排序
l=[{'name':'alex','age':84},{'name':'oldboy','age':73},
{'name':'egon','age':18}]
l.sort(key=lambda x:x['age'])
print(l)
# [{'name': 'egon', 'age': 18}, {'name': 'oldboy', 'age': 73}, {'name': 'alex', 'age': 84}]

内置函数:

  range()
  print()
  len()

  # python内部提供的内置方法
  max, min, sorted, map, filter

  max: 获取可迭代对象中最大值

  min: 获取可迭代对象中最小值
  sorted: 对可迭代对象进行排序

    默认是: 升序
    reverse=True: 降序

  map: 映射

  reduce: 合并  

  filter: 过滤

# max求最大值   max(可迭代对象)
list1 = [1, 2, 3, 4, 5] # max内部会将list1中的通过for取出每一个值,并且进行判断
print(max(list1)) # dict1 = {
'tank': 1000,
'egon': 500,
'sean': 200,
'jason': 500
} # 获取dict1中薪资最大的人的名字
# 字符串的比较: ASCII
print(max(dict1, key=lambda x: dict1[x])) #tank 因为以索引判断,所以key就是索引,参数x为索引

# 获取dict1中薪资最小的人的名字
print(min(dict1, key=lambda x:dict1[x]))

 
# sorted: 默认升序(从小到大) reverse:反转 reverse默认是False
list1 = [10, 2, 3, 4, 5]
print(sorted(list1))
# reverse=True--> 降序
print(sorted(list1, reverse=True)) 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)

map()

  map(函数地址, 可迭代对象) ---> map对象
  map会将可迭代对象中的每一个值进行修改,然后映射一个map对象中,
  可以再将map对象转换成列表/元组。
  注意: 只能转一次。

name_list = ['egon', 'jason', 'sean', '大饼', 'tank']
map_obj = map(lambda name: name + '喜欢吃生蚝' if name == 'tank' else name + 'DJB', name_list)
print(map_obj) # map_obj ---> list/tuple
print(list(map_obj)) # map_obj ---> 生成器(迭代器) ---> 用完后,不能再取了
print(tuple(map_obj))  # map对象只能调用一次,第二次返回空 # 结果
# <map object at 0x00000000021CF4A8>
# ['egonDJB', 'jasonDJB', 'seanDJB', '大饼DJB', 'tank喜欢吃生蚝']
# ()
list1=[1,2,3,4,5]
res=map(lambda x:x**2,list1)
print(list(res)) # [1, 4, 9, 16, 25] def square(x):
return x**2
----------------------------------------
list1=[1,2,3,4,5]
res=map(square,list1)
print(list(res)) # [1, 4, 9, 16, 25]

reduce()    # 函数必须接受两个参数

  reduce(函数地址, 可迭代对象, 默认为0)
  reduce(函数地址, 可迭代对象, 初始值)

# reduce
from functools import reduce #需要导入模块
# 每次从可迭代对象中获取两个值进行合并,
# 初始值: 执行reduce函数时,都是从初始值开始合并
reduce(lambda x, y: x + y, range(1, 101), 0)# 先算x=0 + y=1,和为x再+2,和再+3...+100 # 需求: 求1——100的和
# 普通
init = 1000
for line in range(1, 101):
init += line print(init) # # reduce
res = reduce(lambda x, y: x + y, range(1, 101), 1000)# 先算x=1000 + y=1,和为x再+2,和再+3...+100
print(res) #

filter()

  filter(函数地址, 可迭代对象) --> filter 对象

# filter
name_list = ['egon_dsb', 'jason_dsb',
'sean_dsb', '大饼_dsb', 'tank']
# filter_obj = filter(lambda x: x, name_list) # 将后缀为_dsb的名字 “过滤出来”
# filter会将函数中返回的结果为True 对应 的参数值 “过滤出来”
# 过滤出来的值会添加到 filter对象中
filter_obj = filter(lambda name: name.endswith('_dsb'), name_list) #是否结尾为'_dsb',如果为true,返回那个值
print(filter_obj) #<filter object at 0x0000000001E4C5C0>
print(list(filter_obj)) # ['egon_dsb', 'jason_dsb', 'sean_dsb', '大饼_dsb']
# print(tuple(filter_obj))
---------------------------------------------------------------- name_list = ['egon_dsb', 'jason_dsb',
'sean_dsb', '大饼_dsb', 'tank']
filter_obj = filter(lambda x:x[-3:] != 'dsb',name_list) print(filter_obj)
print(list(filter_obj)) # ['tank']

python基础语法9 生成器,面向对象编程思想,三元表达式,列表生成式,生成器表达式(生成式),匿名函数,内置函数的更多相关文章

  1. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

  2. Python学习笔记014——迭代工具函数 内置函数enumerate()

    1 描述 enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. 2 语法 enumerate(sequ ...

  3. python 匿名函数&内置函数

    匿名函数:为了解决那些功能很简单的需求而设计的一句话函数怎么定义匿名函数: cal = lambda x : x*x # cal是函数名,lambda是定义匿名函数的关键字 冒号前面的额x是参数即函数 ...

  4. python 函数--内置函数

    一.内置函数 内置函数是python自带的一系列常用函数. 二.python3中内置函数     内置功能     abs() delattr() hash() memoryview() set() ...

  5. python语法基础-函数-内置函数和匿名函数-长期维护

    ##################     内置函数        #######################  """ 一共是 68个内置函数: 反射相关的内置函 ...

  6. python基础语法3 整形,浮点,字符串,列表

    整形: ========================基本方法===========================用途: 一般用于定义整数:年龄.身份证号.qq号定义方式:age = 18 # a ...

  7. python基础12_匿名_内置函数

    一个二分查找的示例: # 二分查找 示例 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35, 36, ...

  8. Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数

    本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...

  9. python基础(10)-匿名函数&内置函数

    匿名函数 例子 返回两个数的和 def add(x, y): return x + y # 等价于 add = lambda x, y: x + y 返回字典中值最大的key dic = {'a': ...

  10. Python之函数——内置函数

    内置函数(Built-in Functions) 截止到3.6版本,python一共为我们提供了68个内置函数.它们就是python提供给的可以直接拿来使用的所有函数,接下来让我们一起认识一下这些函数 ...

随机推荐

  1. serializers进阶

    文章出处  https://www.cnblogs.com/pyspark/p/8607801.html [01]前言    serializers是什么?官网是这样的”Serializers all ...

  2. HashTable源码

    1. 为什么无法创建更大的数组? Attempts to allocate larger arrays may result in OutOfMemoryError 如果数组长度过大,可能出现的两种错 ...

  3. python迭代有限制,突破限制

    python默认迭代次数为996 需要修改才能迭代超过996 import sys sys.setrecursionlimit() #自定义扩展极限,可以自己改 def fun(n): print(n ...

  4. Java学习之旅(一):探索extends

    鄙人为兴趣爱好,0基础入门学习Java,有些心得想法,记录于此,与君分享. 然毕竟新手,学识尚浅,错误之处,希望多多指正批评,也是对我最大的帮助! 前言:本篇文章,主要讨论在子类继承父类之后,一些继承 ...

  5. Java的常用API之Date类简介

    Data类 java.util.Date:表示日期和时间的类类Date 表示特定的瞬间,精确到毫秒.毫秒:千分之一秒 1000毫秒=1秒 把日期转换成毫秒: 当前的日期:2019-07-18 时间原点 ...

  6. SqlServer 2012 清理日志 截断日志的方法

    ALTER DATABASE test SET RECOVERY SIMPLE WITH NO_WAITALTER DATABASE test SET RECOVERY SIMPLE --简单模式DB ...

  7. golang学习笔记--函数和方法

    在go中,函数类型是一等类型,这意味着可以吧函数当做一个值来传递和使用. func divide(dividend int,divisor int)(int,error){ //省略部分代码 } 参数 ...

  8. SQL Server的外键必须引用的是主键或者唯一键(转载)

    问: In SQL Server , I got this error -> "There are no primary or candidate keys in the refere ...

  9. c#使用SoundPlayer播放wav格式音频

    1.引用System.Media名称空间下的类SoundPlayer   SoundPlayer player = new SoundPlayer(); 2.方法调用Play(); public vo ...

  10. .Net Core WebAPI开启静态页,设置主页

    1.使用场景 默认创建的.Net Core WebAPI应用在运行时是没有页面显示的,效果如下: 那么,如果想要给API设置一个主页,应该怎么做呢?这就需要用到本文提供的方法. 2.设置方法 (1)首 ...