"""
匿名函数
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-匿名函数,递归与二分法,面向过程编程的更多相关文章

  1. python之迭代器、生成器、面向过程编程

    一 迭代器 一 迭代的概念 #迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不 ...

  2. python之迭代器、生成器与面向过程编程

    目录 一 迭代器 二 生成器 三 面向过程编程 一.迭代器 1.迭代器的概念理解 ''' 迭代器从字面上理解就是迭代的工具.而迭代是每次的开始都是基于上一次的结果,不是周而复始的,而是不断发展的. ' ...

  3. python函数:匿名函数、函数递归与二分法、面向过程编程

    今天主要讲三大部分内容: 一.匿名函数二.函数递归与二分法三.面向过程编程 一.匿名函数: """ 1. 什么时匿名函数 def定义的是有名函数:特点是可以通过名字重复调 ...

  4. 匿名函数 python内置方法(max/min/filter/map/sorted/reduce)面向过程编程

    目录 函数进阶三 1. 匿名函数 1. 什么是匿名函数 2. 匿名函数的语法 3. 能和匿名函数联用的一些方法 2. python解释器内置方法 3. 异常处理 面向过程编程 函数进阶三 1. 匿名函 ...

  5. python第四周迭代器生成器序列化面向过程递归

      第一节装饰器复习和知识储备------------ 第一节装饰器复习和知识储备------------ def wrapper(*args,**kwargs): index(*args,**kwa ...

  6. Python 迭代器-生成器-面向过程编程

    上节课复习:1. 函数的递归调用 在调用一个函数的过程中又直接或者间接地调用了函数本身称之为函数的递归 函数的递归调用有两个明确的阶段: 1. 回溯 一层一层地调用本身 注意: 1.每一次调用问题的规 ...

  7. day22 yield的表达式的应用,面向过程编程,内置函数前几个

    Python之路,Day10 = Python基础10 生成器表达式: (i for i in range(10) if i > 5)os.walk(r'文件路径')返回一个迭代器, 第一次ne ...

  8. python匿名函数

    文章导读: 以前自己一直没搞明白Python中的匿名函数,现在拿这个问题基本上搞明白了,拿自己的理解整成一篇文章,附带大量例子,让其更加好理解. 在编程语言中,函数的应用: 1. 代码块重复,这时候必 ...

  9. JS匿名函数递归实现阶乘

    var rs = (function (value) { if (value > 1) return value * arguments.callee(value - 1); return va ...

随机推荐

  1. babel与ES6环境的搭建

    我们知道浏览器环境下直接运行ES6是存在一些兼容性问题的.那么把ES6变成ES5不就行了吗? 那如何将ES6转换成ES5呢?我们来搭建它的转换环境吧~ 第一步:初始化项目,建立写注意事项的README ...

  2. (Arrays.sort() 或 map) Ignatius and the Princess IV hdu1029

    Ignatius and the Princess IV 链接:http://acm.hdu.edu.cn/showproblem.php?pid=1029 借鉴链接:https://blog.csd ...

  3. Java跨平台(系统)的主要原理

    Java是可以在系统运行的,主要是Java在执行的时候先通过Java虚拟机JVM,对应不同的操作系统,JVM会采用对应的翻译机制.

  4. 继承之es5对比es6

    es5: 熟悉es5的童鞋们就知道es5的继承多么恶心~~ es5最经典的继承写法就是如下这样 1.写一个function,用this来扩展其值类属性 2.prototype添加其方法类属性 3.若整 ...

  5. GoLang基础数据类型--->字符串处理大全

    GoLang基础数据类型--->字符串处理大全 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 欢迎加入:   高级运维工程师之路               59843264 ...

  6. passat / maintenance / baoyang

    s s 南京迎客隆汽车租赁有限公司 / 地址:常府街54号 / 电话:025-84546836 84507610 二手车养不起.修不起?果真如此吗?http://www.che168.com/list ...

  7. iPhone电源键坏了怎么开机和关机?

    一.开机 1.将USB数据线插到iPhone上,此时先不要将另一头插到电脑上 2.长按Home键不要动 3.将数据线的另一头插到电脑上 这时iPhone就会自动开机 二.关机 1.进入设置找到“通用” ...

  8. linux系统下安装ruby环境

    1. 移除现有 Ruby 默认源 输入以下指令 $gem sources --remove https://rubygems.org/ 2. 使用新的源 输入以下指令 $gem sources -a  ...

  9. jackson的自动检测机制

    jackson允许使用任意的构造方法或工厂方法来构造实例 使用@JsonAutoDetect(作用在类上)来开启/禁止自动检测 fieldVisibility:字段的可见级别 ANY:任何级别的字段都 ...

  10. authentication failed for xxx错误

    现象: 公司windows定期修改过密码后 一直报错.push的时候显示“Authentication Failed for http://x.x.x.x/x/git” 猜想: 发现可能是账号问题. ...