PYTHON-匿名函数,递归与二分法,面向过程编程
"""
匿名函数
1 什么是匿名函数
def定义的是有名函数:特点是可以通过名字重复调用
def func(): #func=函数的内存地址
pass
匿名函数就是没有名字的函数:特点是只能再定义时使用一次 匿名
lambda x,y,z=1:x+y+z
#与函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,除非让其有名字
func=lambda x,y,z=1:x+y+z
func(1,2,3)
#让其有名字就没有意义 2 为何要用匿名函数
强调:
匿名函数的定义就相当于只产生一个变量的值,而没有绑定任何名字,
所以会在定义完之后就被回收,无法重复使用,只能在定义时使用一次
应用:当某一个功能仅使用一次就没有再重复使用的必要了,就应该定义成匿名函数 3 有名字的函数与匿名函数的对比
有名函数:循环使用,保存了名字,通过名字就可以重复引用函数功能 匿名函数:一次性使用,随时随时定义 4 如何用匿名函数
lambda x,y:x+y
应用:max,min,sorted,map,reduce,filter """
max,min----------------------------
lambda x,y:x+y,是一个内存地址
nums=[10,-1,11,9,23]
print(max(nums))
print(max(salaries.values()))
salaries = {
'egon练习': 3000,
'alex': 100000000,
'wupeiqi': 10000,
'yuanhao': 2000}
匿名函数key=函数的内存地址: 作用是控制max函数的比较的值
def func(x):
return salaries[x] print(max(salaries,key=func)) 1. 将可迭代对象salaries变成迭代器对象iter_obj
2. next(iter_obj)得到一个人名,然后将该人名当作参数传给key指定的函数,
然后调用函数将函数的返回值当作比较依据
3. 比较大小,取出最大值对应的人名
print(max(salaries,key=lambda k:salaries[k]))
print(min(salaries,key=lambda k:salaries[k])) 比较平方的大小max min
nums=[10,-1,11,9,23]
def func(x):
return x**2
res=max(nums,key=func)
print(res) sorted----------------------------------
sorted排序:创建一个新的变量,不会改变原值。sort时会直接覆盖原值。
nums=[10,-1,11,9,23]
print(sorted(nums))
print(sorted(nums,reverse=True)) nums.sort()
print(nums)
nums.sort(reverse=True)
print(nums) salaries={
'egon练习':3000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':2000}
print(sorted(salaries,key=lambda k:salaries[k]))
print(sorted(salaries,key=lambda k:salaries[k],reverse=True)) map映射,值的数量不变-----------------------
names = ['alex', 'wupeiqi', 'yuanhao', 'kevin', 'hu老师']
方式一:手动实现
new_names=[]
for name in names:
new_names.append(name+'dsb')
print(new_names) 方式二:列表生成式
new_names = [name + 'dsb' for name in names]
print(new_names) 方式三:map+匿名函数
res = map(lambda x: x + 'dsb', names)
print(res)
print(list(res)) reduce 合并,值的数量减少--------------------
方式一:手动实现
res=0
for i in range(101):
res+=i
print(res) 方式二:列表生成式
print(sum([i for i in range(101)])) 方式三:reduce+匿名函数
from functools import reduce
print(reduce(lambda x,y:x+y,[i for i in range(101)],100))
print(reduce(lambda x,y:x+y,[i for i in range(101)]))
print(reduce(lambda x,y:x+y,['h','e','l','l','o'],'----------')) filter筛选---------------------
names = ['alex_dsb', 'wxx_sb', 'kevin_sb', 'hu_sb', 'egon练习']
方式一:手动实现
new_names=[]
for name in names:
if name.endswith('sb'):
new_names.append(name)
print(new_names) 方式二:列表生成式
new_names=[name for name in names if name.endswith('sb')]
print(new_names) 方式三:filter+匿名函数
res=filter(lambda name:name.endswith('sb'),names)
print(res)
print(list(res)) =====================================
'''
递归与二分法 1. 什么是函数递归
函数的递归调用是函数嵌套调用的一种特殊形式,
特殊在调用一个函数的过程中又直接或者间接地调用了该函数本身 递归本质就是一个循环的过程,
但是递归必须满足两个原则:
1. 每进入下一层递归,问题的规模必须有所减少
2. 递归必须有一个明确的结束条件或者说有一个明确的进入下一层递归的条件
并且递归有两个明确的阶段
1. 回溯: 一层一层地递归调用下去
2. 递推: 再某一层结束掉递归,然后一层一层返回 回溯就是从外向里一层一层递归调用下去,
回溯阶段必须要有一个明确地结束条件,每进入下一次递归时,
问题的规模都应该有所减少(否则,单纯地重复调用自身是毫无意义的) 递推就是从里向外一层一层结束递归 2, 为何要用递归
在某些情况下,基于递归来使用重复的过程比while循环更加简单 3, 如何用 '''
def f1():
print('from f1')
f1()
f1() def f2():
print('from f2')
f1() def f1():
print('from f1')
f2()
f1() 递归举例:
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(1)=18 # n=1 def age(n):
if n == 1:
return 18
else:
return age(n-1)+2 res=age(5)
print(res) list1 = [1, [2, [3, [4, [5, [6, [7, [8, [9, ]]]]]]]]] def func(lines):
for line in lines:
if type(line)is list:
func(line)
else:
print(line)
func(list1) def func(l):
for item in l:
if type(item) is list:
# 将item当作一个新列表传给功能本身
func(item)
else:
print(item)
func(list1) 二分法: 二分法是算法的一种,算法是如何高效地解决问题的思路
想从一个按照从小到大排列的数字列表中找到指定的数字,遍历的效率太低,
用二分法(算法的一种,算法是解决问题的方法)可以极大低缩小问题规模
nums = [1, 13, 15, 23, 27, 31, 33, 57, 73, 81, 93, 94, 97, 101] # 从小到大排列的数字列表 for num in nums:
if 58 == num:
print('find it')
break
else:
print('not exists') nums = [1, 13, 15, 23, 27, 31, 33, 57, 73, 81, 93, 94, 97, 101] # 从小到大排列的数字列表 find_num = 97
def searh_num(find_num, nums):
print(nums)
if len(nums) == 0:
print('not find!')
return
mid_num = len(nums) // 2
if find_num>nums[mid_num] :
# print('right')
nums = nums[mid_num + 1:]
# 再次运行功能
searh_num(find_num, nums)
elif find_num <nums[mid_num]:
# print('left')
nums = nums[:mid_num]
# 再次运行功能
searh_num(find_num, nums)
else:
print('find it') searh_num(97, nums) def binary_search(find_num,nums):
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(find_num,nums)
elif find_num < nums[mid_index]:
# in the left
nums=nums[:mid_index]
# 重新运行功能,传入新列表
binary_search(find_num,nums)
else:
print('find it') binary_search(97,nums)
binary_search(95,nums) ============================= 面向过程编程: 1、首先强调:
面向过程编程绝对不是用函数编程这么简单,
面向过程是一种编程思路、思想,而编程思路是不依赖于具体的语言或语法的。
言外之意是即使我们不依赖于函数,也可以基于面向过程的思想编写程序 2、定义
面向过程的核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么
基于面向过程设计程序就好比在设计一条流水线,是一种机械式的思维方式 优点:
复杂的问题流程化,进而简单化
缺点:
可扩展性差,修改流水线的任意一个阶段,都会牵一发而动全身 3、应用:扩展性要求不高的场景,典型案例如linux内核,git,httpd 4、举例
流水线1:
用户输入用户名、密码--->用户验证--->欢迎界面 流水线2:
用户输入sql--->sql解析--->执行功能 ps:函数的参数传入,是函数吃进去的食物,而函数return的返回值,
是函数拉出来的结果,面向过程的思路就是,把程序的执行当做一串首尾相连的功能,
该功能可以是函数的形式,然后一个函数吃,拉出的东西给另外一个函数吃,
另外一个函数吃了再继续拉给下一个函数吃。。。
PYTHON-匿名函数,递归与二分法,面向过程编程的更多相关文章
- python之迭代器、生成器、面向过程编程
一 迭代器 一 迭代的概念 #迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不 ...
- python之迭代器、生成器与面向过程编程
目录 一 迭代器 二 生成器 三 面向过程编程 一.迭代器 1.迭代器的概念理解 ''' 迭代器从字面上理解就是迭代的工具.而迭代是每次的开始都是基于上一次的结果,不是周而复始的,而是不断发展的. ' ...
- python函数:匿名函数、函数递归与二分法、面向过程编程
今天主要讲三大部分内容: 一.匿名函数二.函数递归与二分法三.面向过程编程 一.匿名函数: """ 1. 什么时匿名函数 def定义的是有名函数:特点是可以通过名字重复调 ...
- 匿名函数 python内置方法(max/min/filter/map/sorted/reduce)面向过程编程
目录 函数进阶三 1. 匿名函数 1. 什么是匿名函数 2. 匿名函数的语法 3. 能和匿名函数联用的一些方法 2. python解释器内置方法 3. 异常处理 面向过程编程 函数进阶三 1. 匿名函 ...
- python第四周迭代器生成器序列化面向过程递归
第一节装饰器复习和知识储备------------ 第一节装饰器复习和知识储备------------ def wrapper(*args,**kwargs): index(*args,**kwa ...
- Python 迭代器-生成器-面向过程编程
上节课复习:1. 函数的递归调用 在调用一个函数的过程中又直接或者间接地调用了函数本身称之为函数的递归 函数的递归调用有两个明确的阶段: 1. 回溯 一层一层地调用本身 注意: 1.每一次调用问题的规 ...
- day22 yield的表达式的应用,面向过程编程,内置函数前几个
Python之路,Day10 = Python基础10 生成器表达式: (i for i in range(10) if i > 5)os.walk(r'文件路径')返回一个迭代器, 第一次ne ...
- python匿名函数
文章导读: 以前自己一直没搞明白Python中的匿名函数,现在拿这个问题基本上搞明白了,拿自己的理解整成一篇文章,附带大量例子,让其更加好理解. 在编程语言中,函数的应用: 1. 代码块重复,这时候必 ...
- JS匿名函数递归实现阶乘
var rs = (function (value) { if (value > 1) return value * arguments.callee(value - 1); return va ...
随机推荐
- Makefile ------ $@ $^ %< 使用
一步一步理解 1.源程序的编译 在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器. 假设我们有下面一个非常简单的源程序(he ...
- 使用博客系统发生_STORAGE_WRITE_ERROR_错误
因为本人有自己的vps正好又最近学习了网络的搭建,但是呢不是一番风顺的在假设好PHP.http和MySQL后吧一个博客系统放进去后出现了以下问题 好吧== 出来了这个问题到是让我看了半天,然后查了查说 ...
- 让maven项目使用nexus作为远程仓库
让maven项目使用nexus作为远程仓库有两种方式,第一种是在项目的pom.xml中进行更改,让单个项目使用nexus仓库:另一种是通过修改maven的配置文件settings.xml进行更改,让所 ...
- 启动tomcat时报错:java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException:A child container failed during start
解决方法:https://www.cnblogs.com/xiangxinhouse/p/6377842.html
- 搭建Spring4+Spring MVC web工程的最佳实践
Spring是个非常非常非常优秀的java框架,主要是用它的IOC容器帮我们依赖注入和管理一些程序中的Bean组件,实现低耦合关联,最终提高系统可扩展性和可维护性,用它来辅助我们构建web工程将会感觉 ...
- MYCAT扩容
一.原架构图: 二.扩容 在HOST1上新增节点db_user2 在HOST2上新增节点db_user2 三.操作步骤 1.mycat 所在环境安装 mysql 客户端程序 2.mycat 的 lib ...
- Python基础【day01】:初始模块(五)
本节内容 1.标准库 1.sys 2.os 2.第三方库 1.for mac 2.for linux Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相应的P ...
- java 中如何声明线程安全的集合 set, map 和list【转】
线程安全的集合 引用自 http://blog.sina.com.cn/s/blog_508938e10102v1ig.html //make thread-safe list List MyStrL ...
- 【1】【JUC】JDK1.8源码分析之ArrayBlockingQueue,LinkedBlockingQueue
概要: ArrayBlockingQueue的内部是通过一个可重入锁ReentrantLock和两个Condition条件对象来实现阻塞 注意这两个Condition即ReentrantLock的Co ...
- Multi-Anti-Nim游戏结论及证明
一.定义 Anti-Nim 游戏: 取走最后一个石子的玩家输 Multi-Nim游戏: 每次取完后可以将一堆石子分为多堆,不能存在空堆 Multi-Anti-Nim游戏: 每次取完后可以将一堆石子分为 ...