1,lamdba匿名函数:为了幸运飞艇源码开发 QQ2952777280【话仙源码论坛】hxforum.com【木瓜源码论坛】papayabbs.com 解决一下简单的需求而设计的一句话函数,语法: 函数名 = lambda 参数: 返回值
列如:def func():
return nn...................................返回的是33
print(func(3)) ....................................此时打印的结果是:9
a = func
a(3).................................................调用函数,并给函数传值
print(a.name)...............................查看函数的函数名,打印出来的是func
用lamdba函数写:
f = lamdba n : n*n................................用 lamdba函数一句话就可以把表达完成
print(f())..............................................f 里边的小括号放参数,在这里 f 是函数名(其实就是个变量)
lamdba表示匿名函数,不用def来声明函数,但是变量旁边要价格小括号给匿名函数传值.
###注意###
1>函数的参数可以有多个,多个参数之间用,隔开
2>匿名函数不管多复杂,只能写一行,且逻辑结束后直接返回数据
3>返回值和正常函数一样,可以是任意数据类型
2,sorted()函数排序函数,语法是:sorted(iterable, key=None, reverse=False)Iterable:是可迭代对象,key:排序规则(排序函数),在sorted内部将可迭代对象中的每一个元素传给这个函数的参数,根据函数运行的结果进行排序.reverse是否为倒序(在这里涉及一个判断)如果reverse= True表示执行倒序,当reverse = False时,表示不执行倒序.要想进行排序,必须得最后处理结果是数字,因为只有数字才能进行排序,否则是字符串什么的不可排序.
列如:lst = [11,33,55,22,44,99,77,66,55,88]
def func(lst):.................................................................声明函数func
return lst.................................................................返回的是一个新的列表
ll = sorted(lst, key=func, reverse= False)...................正序严格按照语法写
print(ll)......................................................................此时打印的结果是:[11,22,33,44,55,55,66,77,88,99]
lamdba的写法:
ll = (lst, key=lambda i:i, reverse=False)..................调用 lambda函数,默认是正序可以不用写reverse=False,倒序的时候必须写
print(ll).............................此时打印的结果是:11,22,33,44,55,55,66,77,88,99
3,filter()筛选函数,语法:(function, 条件判断(eg: i : i %2==0), Iterable)
function是用来筛选函数的,在filter中会自动把元素传递给function,然后根据function返回的True还是False来判断是否保留数据
列如:lst = [11,22,55,6,,4,33,44,88,7,9,7,5,,4]
ll = filter(lambda i:i %2 == 0, lst)................................筛选以后形成一个全新的列表
print(ll)...........................................此时打印的是一个关于filter对象的内存地址:<filter object at 0x000001915BABE240>
print(list(ll)).............................此时打印的是筛选后的列表:[22,6,4,44,88,4]
列如:lst = [
{"id":1, "name":'alex', "age":18},
{"id":2, "name":'wusir', "age":16},
{"id":3, "name":'taibai', "age":17}
]
fl = filter(lambda e: e['age'] > 16, lst) # 筛选年年龄⼤大于16的数据
print(list(fl))..................................出来的还是列表套字典
4,map()映射函数,语法:map(function,Iterable)可以对可迭代对象中的每一个元素进行映射,分别去执行function(函数)
列如:lst = [1,2,3,4,5,6]
ll = map(lambda i: i*i, lst)..................对列表中的每个元素进行自己乘以自己(自己映射自己)
print(ll).............................................打印出来的是map的内存地址
print(list(ll))......................................打印出的是:[1, 4, 9, 16, 25, 36],出来的是一个全新的列表
列如:lst1= [1,2,3]
lst2= [4,5,6]
ll = map(lambda x,y:x+y,lst1 lst2)................将2个列表其中的每个元素按相同的索引去相加(体现映射)
print(ll).........................................................打印出来的还是关于毛的内存地址<map object at 0x000001C35C59E358>
print(list(ll))......................................此时打印的结果:[5, 7, 9]...........#(形成的还是一个新列表)
5,递归:自己调用自己,就是递归(神一样的存在,一个包子饿了,把自己给吃了)
列如:def func(count):
print(神一样的存在+str(count))
func(count+1)
func(1) .....................................................相当于是一个死循环,但是python中最递归997次
列如:import sys
sys.setrecursionlimit(10000).................................设置递归权限在10000以内
def func(count):
print("神一样的存在"+str(count))
func(count+1)
func(1)..............................................................打印结果是前3222项,最多是3222项
递归可以应用在:各种树形结构,文件夹系统,可以使用递归来遍历.(多用于一分二.二分四,这种联系极强的个体之间.)
列如:遍历文件夹.
import osorkspace
filePath = "d:\sylar\python_workspace"..........................................获取文件的路径实在拿进行的操作
def read(filePath,n):
it = os.listdir(filePath)...................................打开文件夹(用it这个变量去接打开的这个文件夹)
for el in it:.................................................把打开文件夹里的(文件/文件夹)遍历出来
fp = os.path.join(filePath,el)...................你需要打开每一个母文件夹下的每一个子文件夹,但每一个子文件夹的路径有都不一 样,但是上一个文件夹遍历出来的加到母文件夹后,就是每一个子文件的路径
if os.path.isdir(fp)...............判断文件夹还是文件(实质还是判断这个文件里边是否还有文件,当此文件中有文件时,则证明这时一个文件夹)
print("\t"n,el)........................."\t"是缩进n是缩进几次 找规律
read(fp,n+1)...................................把是文件夹的元素放到函数里边继续打开(递归)递归的入口
else:
print("\t"*n,el)....................直到判断打开的都是文件为止,就不在进行操作(也是递归的一个界限和限制,即递归的出口)
read(filePath,0)
6,二分法:每次能排除掉一般的数据效率较高,但是用二分法必须是有序数列,无序则不好使.
方法一:算法(实质是找到目标元素在列表的中的位置,并记录查找的次数)
列如:lst = [11,22,33,44,55,66,77,88,99,123,234,345,456,567,678,789,1111]
n = 156...............................................................写出目标数
left = 0...............................................................找到最左边的位置0(把位置定好)
right = len(lst)-1...............................................找到最右边位置len(lst)-1
count = 1...........................................................count是记录查找的次数
while left <= right:.............................................循环是因为要重复去二分查找目标元素
middle = (left+right)//2................................这个中间值是时刻在变化的,
if n > lst[middle]:..........................................判断目标元素是否大于中间位置的元素
left = middle+1..............如果目标元素大于中间位置元素,则此时的中间元素变成左端的元素,然后再去求中间值
elif n< lst[middle]:................否则如果目标元素小于中间元素,
right = middle-1..................此时中间位置的元素想左移动一位
else:
print(count).................否则就是找到了,记录总共查找了几次
print("找到了").....................提示找到了
print(middle)..........................打印这个目标函数在列表中的位置
break...............................................此时要跳出循环
else:
print("不存在").........................此列表中没有目标元素.
方法二:递归二分法
例如:lst = [11,22,33,44,55,66,77,88,99,123,234,345,456,567,678,789,1111]
def binary_search(left,right,n):..................................定义一个函数,函数的参数是:left,right(n是目标数)
middle = (left + right) // 2..............................middle是中间数,是通过left和right算出来的(它是跟从left和right变得)
if left > right:...................................当左边比右边大时,说明目标数没有在列表中
return -1.........................返回-1表示不在lst中,也有停止调用函数的功能,(-1)表示和输出的其他数据保持一致
if n > lst[middle]:.......................如果目标数比中间数大,说明目标数在lst的右半部分
left = middle + 1.........................此时的中间数想右移动一位,即left现在是中间数右移的值
elif n < lst[middle]:.............................如果目标数比中间值小,说明目标数在;lst的左半部分
right = middle - 1................此时中间数向左移动一个位置,right就变成此时middle左移的值
else:
return middle......................要用return,不能用print,return有停止调用函数的功能
return binary_search(left,right,n)...............再次调用函数的时候,必须要用return,谁调用而突然就把值返回给谁.**#
binary_search(left,right,n).....................打印返回的值