目录:

一、列表推导式

二、生成器表达式

三、集合生成器

四、生成器面试题

五、解耦简单介绍

六、函数递归相关

一、列表推导式

需求:将[1,3,5]中的每个元素平方

正常思路:

 new_list = []
for i in [1,3,5]:
new_list.append(i*i)
print(new_list) #输出结果:[1, 9, 25]

列表推导式:以[ ]框住里面的内容

print([i*i for i in [1,3,5]])  #输出结果:[1, 9, 25]

列表推导式图示流程:

可以看出列表推导式的作用就是简化代码

列表推导式例题:

1.输出10以内能被三整除的数的平方

print([i*i for i in range(10) if i %3 == 0])  #[0, 9, 36, 81]

2.输出列表每一个包含‘o’元素的字符串

list_case = [['one','two','three'],['four','five','six']]

正常思路:

 list_case = [['one','two','three'],['four','five','six']]
for i in list_case:
for v in i:
if v.count('o')>0:
print(v)

列表推导式:

list_case = [['one','two','three'],['four','five','six']]
print([v for i in list_case for v in i if v.count('o')>0])

二、生成器表达式:

( )框住里面的内容,就是把列表表达式的[ ]改成( ),就是生成器表达式

例如:

 case = ('第%d个人' %i for i in range(3))

从生成器中取值的三种方法:

生成器表达式作用:节省内存,简化代码,相比较列表表达式多了一个节省内存的作用,那是因为生成器具有惰性求值的特性

生成一个人生成器归生成,我内存不会加载他,只有当你用的时候我才去加载他。

用户要一个数据,生成器就给一个数据,比如前面例题的range(3),列表表达式就是一下子生成3个,生成器表达式就是你要一个我生成一个。

三、集合生成器:

{  }框住里面的内容,自带去重功能

lis_case = [-1,1,2,3]
print({i*i for i in lis_case}) #输出结果{1, 4, 9}

在以后工作中,列表推导式最常用,但是尽量把列表推导式变成生成器推导式,因为这样节省内存,节省内存的思想应该处处体现在代码里,这样才能体现水平。

四、生成器表达式面试题:

有如下代码:问输出的结果是什么?

 def demo():
for i in range(4):
yield i
g=demo()
g1=(i for i in g)
g2=(i for i in g1)
print(list(g1))
print(list(g2))

答案:

[0, 1, 2, 3]
[]

考点:

内存加载第5行和第6行的时候是不会加载里面的内容的,然后第7行调用g1的时候内存才会去加载g1的内容

g1本质上是一个生成器推导式,只能用一次,所以第7行print一次之后,g1就是空列表了

生成器练习题:问输出结果是啥?

 def add(n,i):
return n+i
def test():
for i in range(4):
yield i
g=test()
for n in [1,10,5]:
g=(add(n,i) for i in g)
print(list(g))

上面的代码可以这样理解:

 # def add(n,i):
# return n+i
# def test():
# for i in range(4):
# yield i
# g=test()
7 # n = 1:
8 # g=(add(n,i) for i in g)
9 # n = 10:
10 # g=(add(n,i) for i in (add(n,i) for i in g))
11 # n = 5:
12 # g=(add(n,i) for i in (add(n,i) for i in (add(n,i) for i in g)))

# print(list(g))

 代码解释:

7~12行代码还是会运行,但只是计算 g=什么 ,并不会计算=后面的具体内容,只有后面真正调用g的时候,即(list(g)),这个时候才会回去执行g=后面的内容。

五、解耦简单介绍:

先看一个需求:

写函数,将“从前有座山,山里有个庙,庙里有个老和尚讲故事,讲的什么呀?”打印10遍

一般写法:

def func_case():
for i in range(10):print('从前有座山,山里有个庙,庙里有个老和尚讲故事,讲的什么呀?')
func_case()

解耦思想写法:

 def func_case():
print('从前有座山,山里有个庙,庙里有个老和尚讲故事,讲的什么呀?')
for i in range(10):
func_case()

这样写的好处就可以在不动第一个函数的情况下,修改打印的次数,一般写法中如果要修改打印次数是直接修改的是函数内部的内容,这样会影响代码质量。

解耦的定义:

要完成一个完整的功能,但这个功能的规模要尽量小,并且和这个功能无关的其他代码应该和这个函数分离

解耦的作用:

1.增强代码的重用性

2.减少代码变更的相互影响

六、函数递归:

递归:一个函数在内部调用自己就叫做递归,递归在函数内部分为递推、回归两个流程,python解释器规定递归层数是有限制的(一般为997层),写递归函数时必须要有一个结束条件

例如需求:1的年龄比2大两岁,2的年龄比3大两岁,3的年龄比4大两岁,4的年龄是40岁,用函数方式计算1的年龄。

这个需求就是典型的递归问题,下面是代码示例:

 def age(n):
if n == 4 :
return 40
return age(n+1)+2
ret = age(1)
print(ret)

代码解释:

递归实例:

用户输入数字n,求n的阶乘:

 n = int(input(">>>:"))
def func(n):
if n == 1:return 1
return n*func(n-1)
print(func(n))

斐波那契:

 n = int(input(">>>:"))
def fib(n):
if n == 1 or n == 2:return 1
return fib(n-1)+fib(n-2)
print(fib(n))

二分法查找索引位置:(需要背过)

 def search(num,l,start=None,end=None):
start = start if start else 0
end = end if end else len(l) - 1
mid = (end - start)//2 + start
if start > end:
return None
elif l[mid] > num : #17,17
return search(num,l,start,mid-1)
elif l[mid] < num:
return search(num,l,mid+1,end)
elif l[mid] == num:
return mid
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
print(search(66,l))

三级菜单:

menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
},
'闸北': {
'火车战': {
'携程': {}
}
},
'浦东': {},
},
'山东': {},
}

menu内容

 def Three_Level_Menu(menu):
while True:
for k in menu:print(k)
key = input('>>>(输入q退出,输入b返回上一层):')
if key == 'q':return 'q'
elif key == 'b':break
elif key in menu:
ret = Three_Level_Menu(menu[key])
if ret == 'q': return 'q'
Three_Level_Menu(menu)

python06-列表表达式、生成器表达式及其面试题、解耦简单介绍、函数递归相关的更多相关文章

  1. python协程函数应用 列表生成式 生成器表达式

    协程函数应用 列表生成式 生成器表达式   一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._n ...

  2. python之列表和生成器表达式篇

    一.协程函数的应用 写一个装饰器用于让协程函数不需要输入再执行一次next()函数 分析: 在装饰器中生成该协程函数的生成器, 并且执行一次next()函数 def firstNext(func): ...

  3. Python - 列表解析式/生成器表达式

    列表解析式: [expr for iter_var in iterable if cond_expr] 生成器表达式: (expr for iter_var in iterable if cond_e ...

  4. 列表生成式&生成器表达式

    一.列表生成式 def func(): return [lambda x:i*x for i in range(4)] print([j(2) for j in func()]) 结果:[6,6,6, ...

  5. Py修行路 python基础 (十二) 协程函数应用 列表生成式 生成器表达式

    一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._next_() 取下一个值 优点: 1.提供了 ...

  6. java面试题之简单介绍一下集合框架

    集合框架分为三块:List列表.Set集合.Map映射 List列表在数据结构上可以被看做线性表,常用的有ArrayList和LinkList(不常用的有Vector(类似于ArrayList)),他 ...

  7. python之生成器(~函数,列表推导式,生成器表达式)

    一.生成器 概念:生成器的是实质就是迭代器 1.生成器的贴点和迭代器一样,取值方式也和迭代器一样. 2.生成器一般由生成器函数或者声称其表达式来创建,生成器其实就是手写的迭代器. 3.在python中 ...

  8. python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)

    1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...

  9. python基础17_列表推导式 vs 生成器表达式

    [ ] 列表推导式,是用简单的语法来生成列表, ( ) 生成器表达式,是用简单的语法创建个生成器. 外观上仅括号不一样. 虽然写起来方便,但是读起来稍显费力,另外,不易调试. # 列表推导式 prin ...

随机推荐

  1. tf.split

    tf.split(dimension, num_split, input):dimension的意思就是输入张量的哪一个维度,如果是0就表示对第0维度进行切割.num_split就是切割的数量,如果是 ...

  2. 内网渗透bypassuac和smb溢出

    对内网渗透需要渗透的目标主机处于跨网段和uac限制的情况做一个渗透记录 环境大致如下 拥有shell权限的win7(有uac限制,处于双网段) 和同win7同一网段下暂时无权限的靶机xp 先对有权限的 ...

  3. Struts2:搭建原理

    记录下,struts2的搭建过程: 1核心jar包: struts-2.1.8\apps\struts2-blank-2.1.8.war 解压后 在struts2-blank-2.1.8\WEB-IN ...

  4. Ubuntu 终端中文回显乱码

    参考文章 : http://wiki.ubuntu.org.cn/%E4%BF%AE%E6%94%B9locale 所用 Ubuntu的版本 : 猜想是这样的: 1.字符的编码和显示时,所处的环境不是 ...

  5. Springboot读取Request参数的坑

    [后端拿参数相关] 默认配置时, getInputStream()和getReader()一起使用会报错 使用两遍getInputStream(),第二遍会为空   当存在@RequestBody等注 ...

  6. SDRAM

    环境:STM32F769discovery板  SDRAM芯片:用的MT48LC4M32B2B5-6A 16Mbyte (sdram和flash一般标的容量都是bit) 硬件图:   第一步 配置FM ...

  7. go-结构体和方法

    结构体类型的字面量由关键字type.类型名称.关键字struct,以及由花括号包裹的若干字段声明组成. type Person struct { Name string Gender string A ...

  8. CSAPP: 位操作实现基本运算

    目录 实验要求 实现代码 1.pow2plus1 2.pow2plus4 3.bitXor 4.tmin 5.isTmax 6.allOddBits 7.negate 8.isAsciiDigit 9 ...

  9. python soket服务和客户端Demo

    #服务端from socket import * s=socket(AF_INET,SOCK_STREAM)#IVP4 寻址 tcp协议 s.bind(('',6666))#补丁端口 s.listen ...

  10. Arduino学习笔记④ 经典按键实验

    1.前言     我们讲了数字IO口介绍以及做了流水灯演示(主要用到IO口的输出功能),这节课我们讲解一下IO口的输入功能,说到输入功能,最经典的例子莫过于按键实验.废话少说,赶紧上车. 2.实验材料 ...