Python-递归、三元表达式列表生成式等
一、函数递归
1.什么是函数递归:函数的递归调用是函数嵌套的一种特殊形式,在调用一个函数的过程中又直接或者间接地调用该函数本身,称之为函数的递归调用
2.递归调用必须明确的两个阶段:
1.回溯:一次次递归调用下去,应该让每一次重复问题的规模有所减少,直到逼近最终的结果,即回溯阶段一定要有明确的结束条件
2.递推:往回一层一层推算结果
例子:
# def age(n): # if n == 1: # return 18 # return age(n-1) + 2 # # # print(age(5))
思路:
# age(5)=age(4)+2 # age(4)=age(3)+2 # age(3)=age(2)+2 # age(2)=age(1)+2 # age(1)=18 # # age(n)=age(n-1)+2 #n>1 # age(n)=18 #n=1
二分法:
# nums=[13,15,17,23,31,53,74,81,93,102,103,201,303,403,503,777] # find_num=503 # # # def binary_search(nums,find_num): # print(nums) # if len(nums) == 0: # print('not exists') # return # mid_index=len(nums) // 2 # if find_num > nums[mid_index]: # # in the right # nums=nums[mid_index+1:] # # 重新执行二分的逻辑 # binary_search(nums,find_num) # elif find_num < nums[mid_index]: # #in the left # nums=nums[0:mid_index] # # 重新执行二分的逻辑 # binary_search(nums,find_num) # else: # print('find it') binary_search(nums,find_num)
二、三元表达式
三元表达式实现的效果就是:条件成立的情况下返回一个值,不成立的情况下返回另外一种值
# res=条件成立情况下返回的值 if 条件 else 条件不成立情况下返回的值 name=input('your name: ').strip() res="SB" if name == 'lqz' else "NB" print(res)
三、列表生成式
# l =[ i for i in range(10)] # print(l) # l = [i for i in range(10) if (i%2)==0] # print(l) names = ['alex_sb','lqz_sb','yyh_sb','fm_sb','egon'] l=[name for name in names if name.endswith('sb')] print(l)
四、字典生成式
keys=[‘name‘,‘age‘,‘sex‘] values=[‘egon‘,18,‘male‘] res=zip(keys,values) print(list(res)) #[(‘name‘, ‘egon‘), (‘age‘, 18), (‘sex‘, ‘male‘)] 方式一 d={ } for k,v in zip(keys,values): d[k]=v print(d) #{‘name‘: ‘egon‘, ‘age‘: 18, ‘sex‘: ‘male‘} 方式二 d={k:v for k,v in zip(keys,values)} print(d) #{‘name‘: ‘egon‘, ‘age‘: 18, ‘sex‘: ‘male‘}
方式三
dic={k:values[i] for i,k in enumerate(keys)}
print(dic)
补充:zip(拉链函数)
s=‘hello‘ l=[1,2,3,] res=zip(s,l) print(list(res)) #[(‘h‘, 1), (‘e‘, 2), (‘l‘, 3)]
五、匿名函数
匿名函数就是没有名字的函数,用于仅仅临时使用一次的场景,没有重复使用的需求,一般和内置函数结合使用
# max,min,sorted,map,filter,reduce
常规函数使用 def
关键字定义,但匿名函数使用 lambda
关键字定义
语法格式为 lambda arguments:expression
-
lambda
:定义匿名函数的关键字 -
arguments
:函数的参数列表,参数之间用逗号(,
)分割。 -
expression
:被返回的表达式,且表达式只能有一个(注意: lambda 定义不包含 return语句)。 - lambda 表达式构建的其实是一个函数对象
内置函数和匿名函数搭配使用的例子:
salaries={ 'egon':300000, 'alex':100000000, 'wupeiqi':10000, 'yuanhao':2000 } # 求最大值 res=max(salaries,key=lambda name:salaries[name]) #'egon' print(res) # 求最小值 res=min(salaries,key=lambda name:salaries[name]) #'egon' print(res)
注:max直接返回的是人名,需要使用里面的参数key,通过key指定的函数,将拿到的返回值当做比较依据。
map()函数:
map(function, iterable, ...)
# map:把一个列表按照我们自定义的映射规则映射成一个新的列表 names=['alex','lxx','wxx','yxx'] # res=map(lambda name: name + "dSB", names) # print(list(res))
filter(func, seq)
该函数的目的是提取出seq中能使func为true的元素序列。func函数是一个布尔函数,filter()函数调用这个函数一次作用于seq中的每一个元素,筛选出符合条件的元素,并以列表的形式返回。
# names=['alex_sb','lxx_sb','wxx_sb','egon','yxx'] # res=filter(lambda name:name.endswith('sb'),names) # print(list(res))
reduce()
格式:
reduce (func, seq[, init()])
# reduce: 把多个值合并成一个结果 from functools import reduce l=['a','b','c','d'] res=reduce(lambda x,y:x+y,l,'A') # 'A','a' => 'Aa' # 'Aa','b'=>'Aab' # 'Aab','c'=>'Aabc' # 'Aabc','d'=>'Aabcd' print(res)
焚膏油以继晷,恒兀兀以穷年。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
OneinStack如何支持fileinfo?
由于php打开fileinfo(php参数–enable-fileinfo)需要大量系统资源才能编译通过,考虑到小内存机器,因此默认OneinStack fileinfo不支持,需额外再安装2016-06-19之后安装oneinstack 执行./addons.sh 选择4 安装fileinfo即可 2016-06-19之前安装oneinstack,请如下手工编译安装 如果需要支持fileinfo,如下:开始编译 cd /root/oneinstack/src tar zxvf php-5.6.20.tar.gz # 解压已经安装的php版本 cd php-5.6.20/ext/fileinfo /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make && make install cd /usr/local/php/lib/php/extensions ls #看到no-debug-non-zts-20131226类似文件夹 cd no-deb...
- 下一篇
Java 学习(27)---(多线程 / Runnable 接口 / 调度和优先级)
多线程 1 .概念 多线程:一个应用程序有多条执行路径进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 多进程的意义 ---提高 CPU的使用率 多线程的意义 ---提高应用程序的使用率 提示:Java程序的运行原理及 JVM的启动是多线程的吗 ? A:Java命令去启动 JVM,JVM会启动一个进程,该进程会启动一个主线程。 B:JVM的启动是多线程的,因为它最低有两个线程启动了, 主线程和垃圾回收线程。 2 .多线程的实现方案 1.继承 Thread 类,2.重写 run 方法; API: public finalStringgetName(): 获取线程的名称 public final voidsetName(Stringname) :设置线程的名称 public staticThreadcurrentThread(): 返回正在执行的线程对象 public finalintgetPriority() :返回线程对象的优先级 public final voidsetPriority(intnewPr...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装