def func(x):  #普通函数
return x*x
ret1 = func(10)
print(ret1) # #匿名函数
f = lambda x:x*x
print(f(10)) #
# 匿名函数写法: 匿名函数名=lambda 参数:返回值
''''''
'''
sorted()函数
写法:sorted(iterable,key=func,reverse=False)
原理:把iterable中的每一个元素,依次作为参数,传递给自定义函数,返回值是数字-int,然后进行排序(默认升序)
比如:列表中是int,字符串等元素
列表中是字典--学生信息(按照学生的年龄进行排序)
列表中是元组--字典的value进行排序 dic.items() sort()和sorted()的区别
1、前者是列表的内置函数,排序后,将列表本身修改了
写法:li1.sort()
2、后者可以用于iterable,排序后,产生一个新的排序后的列表,原列表本身没有修改
写法:li2 = sorted(li1)
''' #1列表的排序
li1 = [1,3,2]
li2 = sorted(li1)
# li2 = sorted(li1,key=None,reverse=False) #和上面行等效
print(li2) #[1, 2, 3]
print('----------------------1 列表的排序') #2字典的排序
#01 按照字典的key进行排序
dic1 = {'':'jack','':'jack3','':'jack2'}
dic2 = sorted(dic1) #将字典的key进行排序
print(dic2) #['1', '2', '3']
print('----------------------2-1 字典的排序 字典的key排序') #02 按照字典的value进行排序
dic1 = {'':'jack','':'jack2','':'jack3'}
print(dic1.items()) #dict_items([('1', 'jack'), ('3', 'jack3'), ('2', 'jack2')])
#将字典通过items()转换成列表嵌套元组的形式,将元组作为整体传递到自定义函数的参数中 li2 = sorted(dic1.items(),key=lambda x:x[1]) #将列表中的元组,按照元组的第2项(字典的value)进行排序
print(li2) #[('1', 'jack'), ('3', 'jack2'), ('2', 'jack3')] dic3 = {}
for i in li2:
dic3[i[0]] = i[1]
print(dic3) #{'1': 'jack', '3': 'jack2', '2': 'jack3'} #将字典的value进行排序
print('----------------------2-2 字典的排序 字典的value排序') #03 按照列表的元素长度来排序
li3 = ['jack','tom','james']
li4 = sorted(li3,key=lambda x:len(x))
print(li4) #['tom', 'jack', 'james']
print('----------------------3-1 按照列表的元素长度来排序 sorted+lambda') #04 按照学生的年龄来排序(列表中嵌套字典)
li4 = [{'name':'jack','age':18},
{'name': 'tom', 'age': 15},
{'name': 'bob', 'age': 19}]
li5 = sorted(li4,key=lambda dic:dic['age'])
print(li5)
#[{'name': 'tom', 'age': 15}, {'name': 'jack', 'age': 18}, {'name': 'bob', 'age': 19}]
#分析:列表中嵌套字典,字典是作为一个元素,整体传递给自定义函数的参数的
''''''
'''
filter函数
1、写法
filter(func,iterable)
2、原理
将iterable中的每一个元素,作为参数传递给自定义函数,返回值是True或者False,保留True
''' #1筛选偶数
li1 = [1,2,3,4,5,6]
li2 = filter(lambda x:x%2==0,li1)
print(li2) #迭代器
print(list(li2)) #[2, 4, 6] 将迭代器转换成列表
print('-------------------------1 filter') #2筛选学生信息,将大于18岁的筛选出来
li2 = [{'name': 'jack', 'age': 18},
{'name': 'tom', 'age': 15},
{'name': 'bob', 'age': 19}]
li3 = filter(lambda dic:dic['age']>18,li2)
print(li3) #迭代器
print(list(li3)) #[{'name': 'bob', 'age': 19}] 将迭代器转换成列表
print('-------------------------2 filter')
'''''
'''
map函数
1、写法
map(func,iterable)
参数1:自定义函数或者匿名函数
参数2:Iterable
返回值:Iterator-迭代器
2、原理
将iterable中的元素,作为参数依次传递入自定义函数,计算返回值,返回迭代器-iterator
''' #1 计算列表中的每个元素平方,返回新列表
li1 = [1,2,3]
li2 = map(lambda x:x*x,li1)
print(li2) #迭代器
print(list(li2)) #[1, 4, 9] 将迭代器转换成列表
print('------------------------1 map') #2 计算两个列表相同位置的元素之后
li3 = [1,3,5]
li4 = [2,4,6]
li5 = map(lambda x,y:x+y,li3,li4)
print(li5)
print(list(li5)) #[3, 7, 11]
print('------------------------2 map')
 ''''''
'''
递归
1、递归的概念
函数自己调用自己,就叫递归
2、递归的深度
递归的深度最多是998
3、递归的本质
找到不断在变的东西,递归就写出来了
比如:每次递归调用都会新生产一个列表(列表的长度是之前的一半)
比如:每次递归调用,列表的左右边界位置都在变化(两者之差在减半)
''' def func():
print('我要递归了')
func() #递归入口 不带参数
# func() #报错
#RecursionError: maximum recursion depth exceeded while calling a Python object def func1(n):
print(n)
n += 1
func1(n) #递归入口,带参数,变动的是n
# func1(0) #报错
#RecursionError: maximum recursion depth exceeded while calling a Python object #1 递归遍历文件夹
# 将指定文件夹的子文件夹及其子目录都列出来
'''
递归遍历文件夹,伪代码思路
1、定义指定文件夹的相对路径(相对路径便于移植,在其他电脑上运行)
定义函数,参数是指定文件夹路径
2、列出指定文件夹下的一级子文件夹(不包含二级子文件夹和二级子文件)和一级子文件
3、遍历循环上述步骤2的列表
4、拼接一级子文件夹和一级子文件的全路径(相对路径)
5、判断全路径是否是文件夹
1、是文件夹,递归调用自己,传入参数全路径
2、不是文件夹,就是文件,打印文件的全路径 步骤:
1、先实现功能
2、再优化不同层级文件夹的缩进--注意点:每次递归调用一次,层级就+1 小结:
递归的本质和原理
1、递归的本质:不断在变的是子文件夹的全路径和层级
2、递归的本质就是要找出不断在变-每次都在变的是什么
3、递归的入口,递归就是函数内自己调用自己
形参是一样的,但是每次传递进来的实参是不一样的
(发现并找到每次传递进来的实参-不同的子文件夹全路径--就是递归的本质)
4、递归入口的参数2:每次递归调用一次,层级就+1
(也说明了文件夹层级每次递归都不一样)
'''
import os def recursion_folder(path1,n):
#参数1:指定文件夹的相对路径
#参数2:文件夹的层级
subfolder_li1 = os.listdir(path1) #['002', '003.py', '005.py', '__init__.py']
#1 列出指定文件夹的一级子文件夹(不包含其二级子文件夹和子文件)和一级子文件,返回列表
for i in subfolder_li1: #2 遍历循环列表
full_path = os.path.join(path1,i) #3 拼接一级子文件夹和一级子文件的全路径(相对路径,路径+文件(夹)名字)
# print(full_path)
if os.path.isdir(full_path):#4 判断全路径是否是文件夹
print('\t'*n+i) #5 是的话,打印文件夹名字(非全路径)
# 文件夹名字(非全路径)前面加上\t制表符-缩进
#指定文件夹下一级子文件夹前面缩进是0-不缩进-顶格打印
#指定文件夹下二级子文件夹前面缩进是1,依次类推。。。
recursion_folder(full_path,n+1) #6 递归入口 函数内自己调用函数自己
#递归函数参数1:一级子文件夹的全路径(路径前缀+一级子文件夹名字)
#递归参数2:文件夹层级+1(每次递归调用一次,层级就+1)
#递归函数:不断在变的是子文件夹的全路径和缩进层级(递归的本质就是要找出不断在变的是什么)--关键点
else: #5 如果全路径不是文件夹,就是文件
print('\t'*n+i)#6 打印文件名字(非全路径)
# 文件名字(非全路径)前面加上\t制表符-缩进
# 指定文件夹下一级子文件前面缩进是0-不缩进-顶格打印
# 指定文件夹下二级子文件前面缩进是1,依次类推。。。
# 注意点:这里隐含一个return 递归的出口 # path1 = r'D:\Program\JetBrains\PycharmProjects\xq_py\全栈16\001'
path1 = r'..\..\001' #指定文件夹的相对路径
#.\当前目录 ..\上级目录 ..\..\上上级目录 推荐相对目录
n=0 #定义缩进层级
recursion_folder(path1,n) #调函数 #指定文件夹的目录结构和层级打印
#
#
# 004.py
# __init__.py
# 003.py
# __init__.py
# 003.py
# 005.py
# __init__.py
 '''''
'''
二分法
1、核心思想
掐头去尾取中间(中位数)
2、前置条件
已经完成了排序(升序或者降序) 二分法查找:
方法1:循环+左右边界位置变动(两者之差减半)
--可以知道目标数在列表中的位置
方法2:递归+新产生列表(新列表长度减半)
--无法知道目标数在列表中的位置
方法3:递归+左右边界位置变动(两者之差减半)
''' # 方法1:循环 + 左右边界位置变动(两者之差减半)
# --可以知道目标数在列表中的位置
def find(n1,li1):
left = 0
right = len(li1)-1
while left <= right:
mid = (left+right)//2 #左右边界在变动,中位数就在变动
if n1 < li1[mid]:
right = mid - 1
elif n1 > li1[mid]:
left = mid + 1
else:
index1 = li1.index(n1)
print('%s 找到了,目标数在列表的下标是 %s' % (n1,index1))
break #跳出整个循环
else:
print('目标数 %s 没找到' % n1)
n1 = 3
li1 = [1,2,3,4,5]
find(n1,li1)
#3 找到了,目标数在列表的下标是 2
print('------------------------1 循环') # 方法2:递归 + 新产生列表(新列表长度减半)
# --无法知道目标数在列表中的位置,因为每次都新产生一个列表
def recursion1(n2,li2):
left = 0
right = len(li2) - 1
if left <= right:
mid = (left+right)//2
if n2 < li2[mid]:
li21 = li2[:mid-1]
return recursion1(n2,li21) #注意点1:必须加上return 递归入口
elif n2 > li2[mid]:
li21 = li2[mid+1:]
return recursion1(n2, li21)
else:
print('目标数 %s 找到了' % (n2))
else:
print('目标数 %s 没找到' % n2)
#隐含一个return None 递归出口
n2 = 4
li2 = [1,2,3,4,5]
recursion1(n2,li2)
print('------------------------2 递归+ 新产生列表') # 方法3:递归 + 左右边界位置变动(两者之差减半)
def recursion2(n3,li3,left,right):
if left <= right:
mid = (left+right)//2
if n3 < li3[mid]: #注意点1:这里小于号坐标是目标数,而不是left
right = mid -1
return recursion2(n3,li3,left,right) #注意点:return加上
elif n3 > li3[mid]:
left = mid + 1
return recursion2(n3, li3, left, right)
else:
index1 = li3.index(n3)
print('%s 找到了,目标数在列表的下标是 %s' % (n3, index1))
return True
else:
print('目标数 %s 没找到' % n3)
return False
n3 = 5
li3 = [1,2,3,4,5]
left = 0
right = len(li1)-1
recursion2(n3,li3,left,right)
#5 找到了,目标数在列表的下标是 4
print('------------------------3 递归+左右边界位置变动')

Python【day 14-4】sorted filter map+递归文件夹+二分法查找的更多相关文章

  1. 小学生都能学会的python(<lamda匿名函数,sorted(),filter(),map(),递归函数>)

    小学生都能学会的python(<<lamda匿名函数,sorted(),filter(),map(),递归函数,二分法>> 1. lambda 匿名函数 lambda 参数: ...

  2. python之内置函数(lambda,sorted,filter,map),递归,二分法

    一.lambda匿名函数 为了解决一些简单需求而设计的一句话函数,lambda表示的是匿名函数,不需要用def来声明,一句话就可以声明出一个函数. 语法: 函数名 = lambda 参数 : 返回值 ...

  3. 内置函数 lambda sorted filter map 递归

    一 lambda 匿名函数 为了解决一些简单的需求而设计的一句话函数 # 计算 n 的 n次方 def func(n): return n**n print(func(10)) f = lambda ...

  4. Day14--Python--函数二,lambda,sorted,filter,map,递归,二分法

    今日主要内容:1. lambda 匿名函数 lambda 参数: 返回值-------------------------------------def square(x): return x**2 ...

  5. lambda,sorted(),filter(),map(),递归,二分法

    1. lambda 匿名函数 语法: lambda 参数:返回值 不能完成复杂的操作例 # li=['21','asdd','weqeqw','wqf']# # it=iter(li)# # prin ...

  6. python 内置函数(二) 进阶函数 递归内容及二分法查找 知识点

    1,lambda:  匿名函数 2.sorgted()  排序函数 3,filter()   过滤函数 筛选 4,map()  映射函数 5.递归 6.二分法 一. 匿名函数: lambda lamb ...

  7. Python内置函数之filter map reduce

    Python内置函数之filter map reduce 2013-06-04 Posted by yeho Python内置了一些非常有趣.有用的函数,如:filter.map.reduce,都是对 ...

  8. Python 创建递归文件夹

    # 创建递归文件夹 def createfiles(filepathname): try: os.makedirs(filepathname) except Exception as err: pri ...

  9. day 15 内置函数二 递归 lamda sorted filter map 二分法求值

    回顾 for i in dict  #对字典进行遍历,拿到的是字典的key  今日主要内容 1. lambda 匿名函数 语法: lambda 参数:返回值 不能完成复杂的操作.只能写一行 注意: 1 ...

随机推荐

  1. ArrayList和LinkedList介绍

    java.util.ArrayList集合的数据存储结构是数组,且是多线程,元素增删慢,查找快, 由于日常使用开发大多数为查询数据,遍历数据,所以ArrayList是最常用的集合.上一节已写了. ja ...

  2. 使用matplotlib.pyplot中scatter()绘制散点图

    1.二维散点图 二维散点图的函数原型: matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=Non ...

  3. HelloDjango 第 11 篇:自动生成文章摘要

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 博客文章的模型有一个 excerpt 字段,这个字段用于存储文章的摘要.目前为止,还只 ...

  4. three.js通过canvas实现球体世界平面地图

    概况如下: 1.SphereGeometry实现自转的地球: 2.THREE.CatmullRomCurve3实现球体线条地图点确定: 3.THREE.Math.degToRad,Math.sin,M ...

  5. Linux安装docker-compose

    下载:curl -L https://get.daocloud.io/docker/compose/releases/download/1.16.1/docker-compose-`uname -s` ...

  6. Cesium区分单击【LEFT_CLICK】和双击事件【LEFT_DOUBLE_CLICK】

    问题描述 在cesium中,用户鼠标左键双击视图或Entity时,实际触发的是两次click和一次dbclick事件,非常影响代码设计,本文记录了如何区分单击[LEFT_CLICK]和双击事件[LEF ...

  7. Spring Boot 2 + jpa + mysql例子

    Spring Data框架为数据访问提供了一个通用的模型,无论访问哪种数据库,都可以使用同样的方式,主要有以下几个功能:(1)提供数据与对象映射的抽象层,同一个对象,可以被映射为不同数据库的数据:(2 ...

  8. IaC云资源编排-Terraform

    Terraform 2019/10/14 Chenxin 整理 转自: https://cloud.tencent.com/developer/article/1469162 IaC与资源编排 IaC ...

  9. [20191101]通过zsh计算sql语句的sql_id.txt

    [20191101]通过zsh计算sql语句的sql_id.txt 1.简单介绍以及测试使用zsh遇到的问题:--//前段时间写的,链接http://blog.itpub.net/267265/vie ...

  10. Django使用xadmin集成富文本编辑器Ueditor(方法二)

    一.xadmin的安装与配置1.安装xadmin,其中第一种在python3中安装不成功,推荐第二种或者第三种 方式一:pip install xadmin 方式二:pip install git+g ...