生成器

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. 《Linux就该这么学》培训笔记_ch07_RAID和LVM

    <Linux就该这么学>培训笔记_ch07_RAID和LVM 文章最后会post上书本的笔记照片. 文章主要内容: RAID(独立冗余磁盘阵列) 部署磁盘阵列 损坏磁盘阵列及修复 磁盘阵列 ...

  2. c语言错题本

    ()malloc(sizeof()) 在stdlib.h包中

  3. 解决新版本R3.6.0不能加载devtools包问题

    首先是看到下面这个文章想试着练习一下,结果第一步就卡住了,无法加载devtools包,繁体字都冒出来了......汗!(没有截图,但过程痛苦不堪~) https://www.sohu.com/a/12 ...

  4. [Atcoder AGC032C]Three Circuits

    题目大意:有一张$n$个点$m$条边的无向连通图,判断是否可以从中分出$3$个环,满足三个环覆盖整张图并且没有重复的边.$n,m\leqslant10^5$ 题解:分类讨论.有度数为奇肯定不行,因为连 ...

  5. 关于win server中 task Scheduler使用

    日常开发过程中最会遇到很多定时任务,利用计算机自带的软件工具,既方便,又快捷,能节省大量的开发时间,而且功能全面,容错率高. 下面举个例子:定时发送邮件,每天8:10准时触发邮件发送脚本 1.首先配置 ...

  6. java基础 抽象

    /** * 抽象方法:就是加上abstract关键字,并去掉大括号,分号结束 * 抽象类:抽象方法坐在的类,必须是抽象类.在class前家abstract即可 * * 如何使用抽象类和抽象方法: * ...

  7. Jwt身份验证

    转载自博友(TerryTon)  1.因为json是通用的,所以jwt可以在绝大部分平台可以通用,如java,python,php,.net等  2.基于jwt是无状态的,jwt可以用于分布式等现在比 ...

  8. 网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

    目录 基于UDP协议的套接字编程 UDP套接字简单示例 服务端 客户端 基于socketserver实现并发的socket 基于TCP协议 server类 request类 继承关系 服务端 客户端1 ...

  9. 网络编程之模拟ssh远程执行命令、粘包问题 、解决粘包问题

    目录 模拟ssh远程执行命令 服务端 客户端 粘包问题 什么是粘包 TCP发送数据的四种情况 粘包的两种情况 解决粘包问题 struct模块 解决粘包问题 服务端 客户端 模拟ssh远程执行命令 服务 ...

  10. 32、flex布局

    html: <div class="parent"> <div class="son">1</div> <div cl ...