一,迭代器
迭代器的概念:
迭代:1,重复的过程。2,在上一次结果的基础上重复。例如:有个苹果,我需要咬很多口,那么我每一次重复咬苹果的过程都是在上一次咬完了的基础上再次重复的。器:容器。
所以,通俗讲,迭代器的意义就是类似于循环的概念,这个循环是基于每次加原本1的循环。
迭代器的应用场景:
对于有序的多个值,我们可以根据下标取值。比如列表。
而对于无序的多个值,我们则无法有序取值。比如字典。
迭代器所要做的,就是实现无序组合的有序取值。
迭代器的应用案例:
for循环就是基于迭代器的原理实现的。
迭代器的代码说明:
dic={'a':1,'b':2,'c':3} iter_dic=dic.__iter__() #得到迭代器对象,迭代器对象即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身 iter_dic.__iter__() is iter_dic #True print(iter_dic.__next__()) #等同于next(iter_dic) print(iter_dic.__next__()) #等同于next(iter_dic) print(iter_dic.__next__()) #等同于next(iter_dic) # print(iter_dic.__next__()) #抛出异常StopIteration,或者说结束标志 #有了迭代器,我们就可以不依赖索引迭代取值了 iter_dic=dic.__iter__() while 1: try: k=next(iter_dic) print(dic[k]) except StopIteration: break
二,生成器
生成器的概念:生成迭代器。
生成器的作用:
1,生成器本质上就是生成迭代器的过程,只要看到生成器的关键字yield,就意味着这个函数,本身就是个迭代器,即遵循迭代器协议,也就是可以实现有序取值。
2,生成器可以实现类似于return的功能,即返回函数执行结果。可以支持多次返回及返回多个值。
生成器的代码说明:
#只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码 def func(): print('====>first') yield 1 print('====>second') yield 2 print('====>third') yield 3 print('====>end') g=func() print(g) #<generator object func at 0x0000000002184360>
三,面向过程编程
参考shell脚本逻辑
#1、首先强调:面向过程编程绝对不是用函数编程这么简单,面向过程是一种编程思路、思想,而编程思路是不依赖于具体的语言或语法的。言外之意是即使我们不依赖于函数,也可以基于面向过程的思想编写程序 #2、定义 面向过程的核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么 基于面向过程设计程序就好比在设计一条流水线,是一种机械式的思维方式 #3、优点:复杂的问题流程化,进而简单化 #4、缺点:可扩展性差,修改流水线的任意一个阶段,都会牵一发而动全身 #5、应用:扩展性要求不高的场景,典型案例如linux内核,git,httpd #6、举例 流水线1: 用户输入用户名、密码--->用户验证--->欢迎界面 流水线2: 用户输入sql--->sql解析--->执行功能
四,三元表达式
三元表达式的概念:基于二元表达式实现的三元表达式
三元表达式的代码解析:
name=input('姓名>>: ') res='true' if name == 'user01' else 'faild' print(res)
五,列表推导式
#1、示例 egg_list=[] for i in range(10): egg_list.append('鸡蛋%s' %i) egg_list=['鸡蛋%s' %i for i in range(10)] #2、语法 [expression for item1 in iterable1 if condition1 for item2 in iterable2 if condition2 ... for itemN in iterableN if conditionN ] 类似于 res=[] for item1 in iterable1: if condition1: for item2 in iterable2: if condition2 ... for itemN in iterableN: if conditionN: res.append(expression) #3、优点:方便,改变了编程习惯,可称之为声明式编程
六,递归
递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用
参考DNS解析。即:
递归:我问妈妈,爸爸在哪里,妈妈说,我知道他去了你哥哥那,你去问你哥哥。我去问哥哥,哥哥说,我知道他去了邻居,你去问邻居,我去问邻居,邻居说,我知道他去了国外。
迭代:我问妈妈,爸爸在哪里。妈妈去问哥哥,哥哥去问邻居。邻居跟我说,他去了国外。
七,匿名函数
匿名就是没有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,除非让其有名字 func=lambda x,y,z=1:x+y+z func(1,2,3) #让其有名字就没有意义
八,内置函数
#注意:内置函数id()可以返回一个对象的身份,返回值为整数。这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以内存地址为准。is运算符用于比较两个对象的身份,等号比较两个对象的值,内置函数type()则返回一个对象的类型
#更多内置函数:https://docs.python.org/3/library/functions.html?highlight=built#ascii