生成器

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. cad.net 2008使用WPF(摘录山人)

    由于WPF的优点多多,而且在大量的winform的操作下感觉到数据操作的麻烦....推荐大家看杨中科WPF数据绑定教程 https://www.bilibili.com/video/av3388348 ...

  2. windows7 安装 docker-compose

    这篇博客,默认你已经安装了docker,下面介绍如何安装docker-compose 1.访问docker-compose的git地址 2.找到最新版的docker-compose 3.打开Docke ...

  3. 第十六节:Asp.Net Core中Session的使用、扩展、进程外Session

    一. 简介 关于Session的原理可参照Asp.Net版本Session的文章,去查阅. 1. 普通用法 (1).通过Nuget引入[Microsoft.AspNetCore.Http]程序集,Co ...

  4. 【学习笔记】Docker基础

    基本概念 Docker是什么? Docker是一种基于Golang开发的虚拟化技术,开发人员和系统管理员使用容器开发,部署和运行应用程序的平台. 使用Linux容器部署应用程序称为容器化. 容器不是新 ...

  5. SQL分类之DQL:查询表中的记录

    DQL:查询表中的记录 select * from 表名: 1.语法 select  字段列表from 表名列表where  条件列表group by 分组字段having 分组之后的条件order ...

  6. 在Asp.Net Core MVC 3.0 视图运行时编译

    在正常情况下,视图在生成的时候就会变为 xxx.Views.dll,在开发的时候,这样很不方便,因为很多的时候,我们只是修改一个样式,调整一些JavaScript代码,这个时候要把项目调试暂停下来,生 ...

  7. 手机端 关闭当前页面的JS

    JS 代码如下   PS:我找的原代码中, 注释部分是没有注释的,但是调试的时候报错,就注释掉了,因为我只需要微信和支付宝的判定,所以这个地方,就没仔细研究 var isLppzApp = false ...

  8. C#生成/调用动态链接库

    参考地址:https://www.cnblogs.com/qq4004229/archive/2013/01/30/2882409.html 一.需求描述 (1)用代码生成动态链接库 (2)用C#代码 ...

  9. 类嵌套_list泛型_餐馆点菜例

    form1内容: private void button1_Click(object sender, EventArgs e) { //声明并初始化一张点菜清单 yiduicai danzi = ne ...

  10. Unity PhysicsScene测试

    应该是unity 2018.3中加入的功能,对象可以放置于不同的物理场景中. 一个Scene对应一个物理场景(PhysicsScene),若想放入独立的物理场景测试创建一个Scene即可.见下图gif ...