三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数(day4)
一、三元表达式、列表推导式、生成器表达式
1、三元表达式name=input('姓名>>: ')res='SB' if name == 'alex' else 'NB'print(res)
2、列表推导式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 condition1for 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)优点:方便,改变了编程习惯,可称之为声明式编程
3、生成器表达式1)把列表推导式的[]换成()就是生成器表达式2)示例:生一筐鸡蛋变成给你一只老母鸡,用的时候就下蛋,这也是生成器的特性>>> chicken=('鸡蛋%s' %i for i in range(5))>>> chicken<generator object <genexpr> at 0x10143f200>>>> next(chicken)'鸡蛋0'>>> list(chicken) #因chicken可迭代,因而可以转成列表['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4',]3)优点:省内存,一次只产生一个值在内存中
二、递归与二分法
1、递归调用的定义递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用
2、递归分为两个阶段:递推,回溯salary(5)=salary(4)+300salary(4)=salary(3)+300salary(3)=salary(2)+300salary(2)=salary(1)+300salary(1)=100salary(n)=salary(n-1)+300 n>1salary(1) =100 n=1def salary(n):if n == 1:return 100return salary(n-1)+300print(salary(5))
3、python中的递归效率低且没有尾递归优化python中的递归效率低,需要在进入下一次递归时保留当前的状态在其他语言中可以有解决方法:尾递归优化,即在函数的最后一步(而非最后一行)调用自己,尾递归优化:http://egon09.blog.51cto.com/9161406/1842475但是python又没有尾递归,且对递归层级做了限制
4、总结递归的使用:1)必须有一个明确的结束条件2)每次进入更深一层递归时,问题规模相比上次递归都应有所减少3)递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
5、可以修改递归最大深度import syssys.getrecursionlimit()sys.setrecursionlimit(2000)n=1def test():global nprint(n)n+=1test()test()虽然可以设置,但是因为不是尾递归,仍然要保存栈,内存大小一定,不可能无限递归
6、二分法
想从一个按照从小到大排列的数字列表中找到指定的数字,遍历的效率太低,用二分法(算法的一种,算法是解决问题的方法)可以极大低缩小问题规模1)实现类似于in的效果l=[1,2,10,30,33,99,101,200,301,402] #从小到大排列的数字列表 def search(num,l):print(l)if len(l) > 0:mid=len(l)//2if num > l[mid]:#in the rightl=l[mid+1:]elif num < l[mid]:#in the leftl=l[:mid]else:print('find it')returnsearch(num,l)else:#如果值不存在,则列表切为空print('not exists')returnsearch(100,l)2)实现类似于l.index(30)的效果l=[1,2,10,30,33,99,101,200,301,402]def search(num,l,start=0,stop=len(l)-1):if start <= stop:mid=start+(stop-start)//2print('start:[%s] stop:[%s] mid:[%s] mid_val:[%s]' %(start,stop,mid,l[mid]))if num > l[mid]:start=mid+1elif num < l[mid]:stop=mid-1else:print('find it',mid)returnsearch(num,l,start,stop)else: #如果stop > start则意味着列表实际上已经全部切完,即切为空print('not exists')returnsearch(301,l)
三、匿名函数
1、什么是匿名函数?匿名就是没有名字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)#让其有名字就没有意义
2、有名字的函数与匿名函数的对比有名函数:循环使用,保存了名字,通过名字就可以重复引用函数功能匿名函数:一次性使用,随时随时定义应用:max,min,sorted,map,reduce,filter
四、内置函数注意:内置函数id()可以返回一个对象的身份,返回值为整数。这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以内存地址为准。is运算符用于比较两个对象的身份,等号比较两个对象的值,内置函数type()则返回一个对象的类型更多内置函数:https://docs.python.org/3/library/functions.html?highlight=built#ascii
本文转自西鼠 51CTO博客,原文链接:http://blog.51cto.com/10630401/2056573,如需转载请自行联系原作者
三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数(day4)相关推荐
- Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数
本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...
- 列表推导式 生成器表达式
推导式 comprehensions(又称解析式):是 Python 中很强大的.很受欢迎的特性,具有语言简洁,速度快等优点 列表推导式 就是一个简单的公式,我们用这个列表推导式,把你好几行的for循 ...
- format函数python生成列表_python 全栈开发,Day14(列表推导式,生成器表达式,内置函数)...
一.列表生成式 生成1-100的列表 li = [] for i in range(1,101): li.append(i) print(li) 执行输出: [1,2,3...] 生成python1期 ...
- python之生成器(~函数,列表推导式,生成器表达式)
一.生成器 概念:生成器的是实质就是迭代器 1.生成器的贴点和迭代器一样,取值方式也和迭代器一样. 2.生成器一般由生成器函数或者声称其表达式来创建,生成器其实就是手写的迭代器. 3.在python中 ...
- Python 列表推导 、生成器表达式与声明式编程
1.****列表推导********* 用到函数的一个常见的操作是将其用于列表的所有项,并使用结果创建一个新的列表.例如: # coding=utf-8 ''' ****列表推导********* 用 ...
- mysql数据字典生成器_「python技术」列表推导、生成器表达式和字典推导的差异及其示例
#开往春天新创作大赛# 前言 列表推导式构建列表的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列.自python2.7以后,列表推导和生成器表达式的概念就应用到了字典上,所以就有了字典推导, ...
- python关键字列表的表达式,python 列表推导和生成器表达式的使用
序列 序列是指一组数据,按存放类型分为容器序列与扁平序列,按能否被修改分为不可变序列与可变序列. 容器序列与扁平序列 容器序列存放的是对象的引用,包括list.tuple.collections.de ...
- 学习日记0802函数递归,三元表达式,列表生成式,字典生成式,匿名函数+内置函数...
1 函数的递归 函数的递归调用时函数嵌套调用的一种特殊形式,在调用的过程中又直接或者间接的调用了该函数 函数的递归调用必须有两个明确的阶段: 1 回溯:函数一次次的调用下去每一次调用,问题的规模都应该 ...
- python三元表达式求值_python 三元表达式的 列表推导式 生成器推导式
python中三元表达式的语法如下 ===if else result = x if condition else y 另外一种三元表达式,比较少见 result = (x, y)[condition ...
- 函数递归/二分法/列表,字典生成式/三元表达式/匿名函数/内置函数
一.递归函数 递归函数:就是在函数调用阶段直接或者间接的调用自己 递归函数的两个阶段: 1.回溯:不停的重复的一个过程,在这个过程中将问题不断的简单化,直到最终打到要求(条件) 2.递归:一次次的往回 ...
最新文章
- 比特币现金(BCH)是世界上最好货币的十大理由
- 简明python教程购买-简明Python3教程 6.基础
- 改变UITextField PlaceHolder的字体和颜色,不影响正常输入
- vue数组中对象属性变化页面不渲染问题
- CentOS 7 使用ip addr查询不到IP
- 从 AVFrame 中取出帧(YUV)保存为 Mat 格式
- PHP把商品详情数据加入到商品数据,如果商品有多个详情只展示一次商品数据
- numpy数组某一行求和 python_【Python】No.2 Numpy和Matplotlib初体验
- mysql 游标循环_MySQL 游标 循环
- 扬州大学计算机科学与技术怎么样,用实力说话!这3所“低调”的大学,有望成为“双一流”建设高校...
- 安卓搞机玩机-什么是“锁 ” BL锁 屏幕锁 账号锁 设备锁等分析
- PHP涉及的所有英文单词
- ORA-12034: materialized view log on SCOTT.T_ROWID younger than last refresh
- 拿到一个vue+webpack项目,该如何去看
- 移动端 react + antd-mobile 二级联动(一二级均多选)
- 都是博士生的西湖大学第三期新招195位学生
- Spark读取Hive数据的两种方式与保存数据到HDFS
- Python实现模拟按键和改键精灵
- 建筑模式语言(美)c.亚历山大.pdf,建筑模式语言下街区设计.pdf
- PHP程序中时间戳,PHP 时间戳 与 时间