一、函数递归
#函数递归调用:在调用一个函数的过程中直接或间接的调用该函数本身,称之为函数的递归调用
# import sys
# print(sys.getrecursionlimit())#查看递归的数目
# # sys.setrecursionlimit(2000)#更改递归数目
#
# n=1
# def func1():
# global n
# print('from func1',n)
# n+=1
# func1()
# # func1()
#间接调用func
# def func():
# print('from func')
# bar()
# def bar():
# func()
# func()
#递归分为两个重要阶段:递推+回溯
# age(5)=age(4)+2
# age(4)=age(3)+2
# age(3)=age(2)+2
# age(2)=age(1)+2
# age(1)=18
# n=!1#age(n)=age(n-1)+2
# n==1#age(n)=18
# def age(n):
# if n == 1:
# return 18
# return age(n-1)+2
# print(age(5))
#总结递归调用:
#1、进入下一次递归时,问题的规模必须降低
#2、递归调用必须要有一个明确的结束条件
#3、在python中没有尾递归优化,递归调用的效率就是不高
#使用递归的情况:不清楚有多少层的情况下
# l=[1,2,[3,[4,[5,[6,7,[8,9,[10]]]]]]]
# def get(l):
# for item in l:
# if isinstance(item,list):#判断类型(item是不是list类型),也可以是if type(item) is list
# get(item)
# else:
# print(item)
# get(l)
二、二分法
l=[1,2,10,30,33,99,101,200,301,402]#从小到大排列的数字列表
def get(num,l):
if len(l)>0:
mid=len(l)//2
# print(l,l[mid])
if num > l[mid]:
#in the right
l=l[mid+1:]#切分列表,只留右边的值
elif num < l[mid]:
#in the lift
l=l[:mid]
else:
print('find it')
return
get(num,l)
else:
print('not find')
return
get(400,l)
三、匿名函数的使用
# def f1(n):
# return n**2
# print(f1)
#
# f2=lambda n:n**2 #自带return返回值
# print(f2)
# print(f2(3))
#匿名函数即没有绑定名字的函数,没有绑定名字,意味着只能用一次就会被回收
#所以说:匿名函数的应用场景就是:某个功能只用一次就结束了
# salaries={
# 'egon':3000,
# 'alex':10000000,
# 'wupeiqi':10000,
# 'yuanhao':2000
#
# }
# print(max(salaries))#默认比较的是key
# print(max(salaries.values()))#取最高的值
# res=zip(salaries.keys(),salaries.values())
# print(max(res)[1])
#补充:序列类型的比较
# t1=(3333,'a')
# t2=(2,'a','b','c')
# print(t1<t2)
# #拉链函数
# l1=[1,2,3]
# s1='hello'
# res=zip(l1,s1)
# print(list(res))
#max与lambda的结合
# salaries={
# 'egon':3000,
# 'alex':10000000,
# 'wupeiqi':10000,
# 'yuanhao':2000
#
# }
# def f1(k):
# return salaries[k]
# print(max(salaries,key=lambda k:salaries[k]))#取出最高工资人
# print(min(salaries,key=lambda k:salaries[k]))
# print(sorted(salaries,key=lambda k:salaries[k]))#从小到大排序
# map,reduce,filter
# l=['alex','wupeiqi','yuanhao','xiaoming']
# print(list(map(lambda x:x+'_SB',l)))
#求和reduce
# from functools import reduce
# print(reduce(lambda x,y:x+y,range(1,101),100))
#filter过滤
# l=['alex_SB', 'wupeiqi_SB', 'yuanhao_SB', 'egon']
# res=filter(lambda name:name.endswith('SB'),l)
# print(list(res))
四、内置函数
#优先掌握
max
min
sorted
map
from _functools import reduce
filter
sum
bool
# print(abs(-1))#取绝对值
# print(all([1,'a',[]]))#看bool值,里面全部为真才为真
# print(all([]))
# print(any([0,None,'',1]))#看bool值,有一个为真结果就为真
# print(any([]))
# print(bin(10))#十进制转二进制
# print(oct(10))#十进制转八进制
# print(hex(10))#十进制转十六进制
#布尔值为假:0,None,空
# bool()
#把字符串类型转换为bytes类型
# print('hello'.encode('utf-8'))
#callable
# print(callable(max))
#把数字转化成字母
# print(chr(65))
# print(chr(66))
# print(chr(90))
#把字符转化成数字
# print(ord('A'))
#complex复数
# x=1-2j#x=complex(1-2j)
# print(type(x))
# print(x.real)
# print(x.imag)
# dict,int,list,tuple,str,float,set,frozenset
# s=set({1,2,3})#可变集合
# s=frozenset({1,2,3})#不可变集合
#查看模块可以调用那些属性
# import time
# print(dir(time))
# print(divmod(1000,25))#可以用来计算页数
# l=['a','b','c','d']
#
# for x in enumerate(l):
# print(x)
#算法,校验字符串,最后给出数值
# print(hash('abdswvimd'))
# print(isinstance(1,int))
# issubclass()
# print(pow(10,2,3))#10**2%3
# print(str({'a':1}))
# l=[1,4,2,9]
# print(list(reversed(l)))#倒着排序
#
# print(round(10.333345,3))#四舍五入
# #
# l1=['a','b','c','d','e']
# l2=['a','b','c','d','e']
# print(l1[1:5:2])
# print(l2[1:5:2])
#
#
# obs=slice(1,5,2)
# print(l1(obs))
# print(l2(obs))
# print(sum([1,2,3,4]))#求和
# print(sum(range(10)))
# print(vars() is locals())
# print(locals())
# m=input('>>:')
# # print(type(m))
#
# # import 'time' #不能导入字符串
# obj=__import__(m)
#obj.sleep(3)
# 了解compile,exec,eval
#eval可以提取字符串内的表达式执行,然后返回结果
# s1='1+2+3'
# print(eval(s1))
#exec:仅仅只是执行字符串内的表达式或语句,没有返回值
# s1='1+2+3'
# print(exec(s1))
# s2='for i in range(10):print(i)'
# print(exec(s2))
五、模块的使用
#第一部分:import
#导入模块,只会在第一次导入时执行源文件代码,
#如果模块已经加载到内存,下一次导入直接引用内存中导入的结果
# import spam
# import spam
# import spam
# import sys
# print('spam' in sys.modules)
#import导入文件都做了哪些事?
#1、以源文件为准产生一个名称空间
#2、以刚刚产生的名称空间为准,执行源文件的代码
#3、会在当前文件中定义一个名字,这个名字就是模块名,用来引用模块中的名字
# import spam
# # money=0
# # def read1():
# # print('from ----->')
# # read1()
# spam.read1()
# spam.read2()
# money=1000000
# # print(money)
# spam.change()
#为模块起别名
# import spam as sm
# print(sm.money)
# engine_type='mysql'
# if engine_type == 'mysql':
# import mysql as engine
# elif engine_type == 'oracle':
# import oracle as engine
# engine.parse()
#在一行导入多个模块
# import spam,time
#第二部分:from...import...
#导出模块中部分属性
# from spam import money,read1,read2,change
# # # money=1
# # # print(money)
# # read1()
# # read2()
# change()
#导出模块中全部属性
# from spam import *
# print(money)
# print(read1)
# print(read2)
# print(change)
# from spam import *#*对应模块spam内的__all__的属性
# # print(money)
# print(read2)
六、模块的搜索路径
#模块的查找顺序是:内存中已经加载的模块-->内置模块-->sys.path(倒模块的环境变量)路径中包含的模块
# import time
# print(time)
# import sys
# print(sys.path)
import sys
sys.path.append(r'C:\Users\ling\PycharmProjects\19期\day5\a')
import m