一、递归函数
定义:在一个函数里调用这个函数本身
递归的最大深度:997
def func(n):
print(n)
n += 1
func(n)
func(1)
测试递归最大深度
import sys
print(sys.setrecursionlimit(10000))
修改递归最大深度
二、内置函数
python提供了68个内置函数
1.作用域相关的内置函数:globals,locals
def func():
a = 1
b = 2
print(globals()) #查看全局变量
print(locals()) #查看局部变量
func()
2.迭代器/生成器相关的内置函数:range,iter,next
a = range(1,100,2) #range是可迭代对象
b = iter(a) #iter得到迭代器
print(next(b)) #打印迭代器第一个元素
print(next(b)) #打印迭代器下一个元素
3.查看内置属性:dir
print(dir(1))
print(dir('abc'))
print(dir(list))
4.判断函数是否可以调用:callable
def a():print(1)
print(callable(a))
5.帮助:help
help(list)
help(str)
6.导入模块:import
import os
import time
import copy
7.打开文件:open
with open('abc','r',encoding='utf-8') as f:
print(f.read())
8.内存相关的内置函数:id,hash
print(id('')) #打印内存地址
print(id([1,2,3])) #打印内存地址
print(hash((1,2,3))) #打印哈希值
print(hash([1,2,3])) #报错
9.输入输出相关的内置函数:input,print
content = input('请输入内容:') #input:与用户交互
print(content)
print('abc','def',sep='*',end='') #sep=以...为分隔,end=以...为结尾
print('ghj') #打印进度条
import time
for i in range(0,101,2):
time.sleep(0.1)
n = i // 2
a = '\r%d%% : %s\n'%(i,'*'*n) if i == 100else '\r%d%% : %s'%(i,'*'*n)
print(a,end='',flush=True) #flush把光标移动到最前面,以空字符结尾
10.字符串类型代码的执行:exec,eval,compile
eval()将字符串类型的代码执行并返回结果
exec()将字符串类型的代码执行
compile()将字符串类型的代码编译。代码对象能够通过exec语句来执行或者eval语句进行求值
参数说明:
1. 参数source:字符串或者AST(Abstract Syntax Trees)对象。即需要动态执行的代码段。
2. 参数 filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。当传入了source参数时,filename参数传入空字符即可。
3. 参数model:指定编译代码的种类,可以指定为 ‘exec’,’eval’,’single’。当source中包含流程语句时,model应指定为‘exec’;当source中只包含一个简单的求值表达式,model应指定为‘eval’;当source中包含了交互式命令语句,model应指定为'single'。
code1 = '1+2+3'
code2 = "print('abc')"
print(eval(code1),eval(code2))
print(exec(code1),exec(code2))
# abc
# 6 None
# abc
# None None
#流程语句使用exec
code1 = """
for i in range(10):
if i % 2 == 1:
print(i)
"""
compile1 = compile(code1,'','exec')
exec(compile1) #简单求值表达式用eval
code2 = '1+2+3+4'
compile2 = compile(code2,'','eval')
print(eval(compile2)) #交互语句用single
code3 = "name = input('请输入命令:')"
compile3 = compile(code3,'','single')
eval(compile3)
print(name)
compile
11.数字的数据类型相关:bool,int,float,comple(布尔值,整数,浮点数,复数)
print(type(True))
print(type(123))
print(type(123.0))
print(type(12+3j)) #<class 'bool'>
#<class 'int'>
#<class 'float'>
#<class 'complex'>
12.进制转换相关:bin,ort,hex(二进制,八进制,十六进制)
print(bin(20)) #0b10100
print(oct(20)) #0o24
print(hex(20)) #0x14
13.数学运算相关:abs(求绝对值),divmod(求商余),round(精确小数),pow(幂运算)
print(abs(-3)) # print(divmod(5,3)) #(1,2) print(round(3.14159,4)) #3.1416 print(pow(2,3)) #
14.计算总数:sum(iterable,start=0)
print(sum([1,2,3],2)) #2+1+2+3 = 8
print(sum((4,5,6,7),10)) #10+4+5+6+7
print(sum((),5)) #
15.计算最大值:max(iterable,key=,default=)、max(*args,key=)
print(max((1,-2,3,-4,5),default=0)) #
print(max([1,2,3,-5,-6],key=abs)) #-6
print(max('A','a',)) #a
print(max(1,2,3,-4)) #
16.计算最小值:min(iterable,key=,default=)、min(*args,key=)
print(min(1,2,3,4,-5,key=abs)) #-5
print(min([1,-2,3,-4,5],default=0)) #-4
print(min([],default=1)) #
17.列表和元组:list,tuple
a = range(8)
b = (i for i in range(5)) #一个生成器只能取一次值
print(list(a)) #[0, 1, 2, 3, 4, 5, 6, 7]
print(list(b)) #[0, 1, 2, 3, 4]
print(tuple(a)) #(0, 1, 2, 3, 4, 5, 6, 7)
print(tuple(b)) #()
18.列表和元组相关内置函数:reversed(接收可迭代对象,返回迭代器),slice(切片)
l = [1,-5,3,4,-2,8]
a = ''
print(reversed(l)) #返回迭代器
print(list(reversed(l))) #[8, -2, 4, 3, -5, 1]
print(list(reversed(a))) #['3', '2', '1']
print(l[slice(2,5,2)]) #[3,-2]
19.字符串相关:str,bytes:bytes(s,encoding='utf-8'),能在网络上传递的必须是字节
a = '你好'
print(bytes(a,encoding='gbk')) #b'\xc4\xe3\xba\xc3'
print(bytes(a,encoding='utf-8')) #b'\xe4\xbd\xa0\xe5\xa5\xbd'
b = '世界'
ret = bytes(b,encoding='utf-8')
print(ret.decode('utf-8')) #世界
20.bytearray:bytearray(s,encoding='utf-8'),字节数组,修改字符串,不会改变字节数组的内存地址,适用于修改多处较长的字符串
ret = bytearray('alex',encoding='utf-8')
print(id(ret))
print(ret[0]) #
ret[0] = 65
print(ret) #bytearray(b'Alex')
print(id(ret))
21.memoryview:memoryview(bytes('hello,eva',encoding='utf-8')),对bytes类型进行切片,不生成新的值
ret = memoryview(bytes('你好',encoding='utf-8'))
print(ret[:3]) #memory的内存地址
print(len(ret)) #
print(bytes(ret[:3]).decode('utf-8')) #你
22.ord:字符按照unicode转数字
chr:数字按照unicode转字符
ascii:只要是ascii码中的内容,就打印出来,不是就转换成\u
print(ord('a')) #
print(chr(97)) #a
print(ord('你')) #
print(chr(12345)) #〹
print(ascii('*')) #'*'
print(ascii('爱')) #'\u7231'
23.rapper:用于%r格式化输出,打印字符串会把引号打印出来
print(123) #
print('') #
print(repr('')) #'123'
print({'key:%r'%('value')}) #{"key:'value'"}
24.dict:字典,set:集合,forzenset:不可变集合,len:计算长度
25.enumerate:枚举,会生成序列号
for i in enumerate(range(5),1):
print(i) #(1, 0)
#(2, 1)
#(3, 2)
#(4, 3)
#(5, 4)
26.all:接收一个可迭代对象,只要有一个为False,则返回False
any:接收一个可迭代对象,只要有一个为True,则返回True
print(all([1,2,3,None])) #False
print(any([1,0,{},''])) #True
27.zip:拉链函数,接收多个可迭代对象,以短的为基准,进行匹配,返回一个迭代器
print(zip([0,1,2,3,4],[5,6,'a','b'])) #返回迭代器
print(list(zip([0,1,2,3,4],[5,6,'a','b']))) #[(0, 5), (1, 6), (2, 'a'), (3, 'b')]
print(list(zip([0,1,2,3],[5,6,7,8],['a','b']))) #[(0, 5, 'a'), (1, 6, 'b')]
28.filter:筛选函数,前面接收函数名,后面接收可迭代对象,返回一个迭代器,只筛选结果为True的元素
map:前面接收函数名,后面接收可迭代对象,返回一个迭代器,将可迭代对象按照函数的功能进行操作并把结果返回
def func(x):
return x and x.strip()
ret = filter(func,['test',None,'','str',' ','END'])
print(list(ret)) #['test', 'str', 'END'] def func1(n):
return n**2
ret1 = map(func1,[1,2,-3,-4,5])
print(list(ret1)) #[1, 4, 9, 16, 25]
29:sorted:从小到大排序,生成一个新列表,sort:从小到大排序,直接改变原列表的顺序
l = [1,2,-3,-4,5]
print(sorted(l)) #[-4, -3, 1, 2, 5]
print(sorted(l,reverse=True)) #[5, 2, 1, -3, -4]
print(l) #[1, 2, -3, -4, 5]