Python内置函数
一、内置函数
什么是内置函数? 就是python给你提供的。 拿来直接⽤的函数, 比如print, input等等。
-
作用域相关
globals() 返回全局作用域中的名字
locals() 返回当前作用域中的名字
-
迭代器相关
range() 获取数据
next() 迭代器向下执行一次,实际上调用了内部的__next__()方法获取迭代器中的下一个数据
iter() 获取迭代器,实际上是调用了内部的__iter__()方法获取迭代器
-
字符串类型代码的执行
eval() 执行字符串类型的代码,并返回结果
print(eval("2 + 2")) # 4 def func(): print("哈哈") eval("func()") # 哈哈
exec() 执行字符串类型的代码
exec(''' for i in range(10): print(i) ''') # 1 2 3 4 5 6 7 8 9 exec(''' def func(): print("你真好看") func() ''') # 你真好看
comlile() 将字符串类型的代码编译, 代码对象能够通过exec语句来执⾏或者eval()进⾏求值
''' 参数说明: 1. resource 要执⾏的代码, 动态代码⽚段 2. ⽂件名, 代码存放的⽂件名, 当传⼊了第⼀个参数的时候, 这个参数给空就可以了 3. 模式, 取值有3个, 1. exec: ⼀般放⼀些流程语句的时候 2. eval: resource只存放⼀个求值表达式. 3. single: resource存放的代码有交互的时候. mode应为single ''' code1 = "for i in range(4): print(i)" ret = compile(code1, "", mode="exec") exec(ret) # 0 1 2 3 code2 = "1 + 2+ 3" ret = compile(code2, "", mode="eval") print(eval(ret)) # 6 code3 = "name = input('请输入你的姓名:')" # dogfa ret = compile(code3, "", mode="single") exec(ret) print(name) # dogfa
-
输入和输出
print() 打印输出
input() 获取用户输入的内容
-
内存相关
hash() 获取到可哈希对象的哈希值
id() 获取对象的内存地址
-
文件操作相关
open() 用于打开一个文件,获取一个文件句柄
-
模块相关
__import__() 用于动态加载类和函数
-
帮助
help() 用于查看函数或类的用途的详细说明
-
调用相关
callable() 检查一个对象是否可调用,如果返回True,对象有可能调用失败,但是返回False,那么则一定调用不成功。
-
查看内置属性
__dir__() 查看对象的内置属性和方法
-
数字相关
bool() 将给定的数据转换成bool值
int() 将给定的数据转换成int类型的值
float() 将给定的数据类型转换成float类型的值,即转换成小数类型
-
进制转换
bin() 将给定的值转换成二进制类型数据
oct() 将给定的值转换成八进制类型数据
hex() 将给定的值转换成十六进制类型数据
-
数学运算
abs() 取绝对值
divmode() 返回商和余数,得到的值是一个元祖,可以解构接收
round() 四舍五入
pow(a, b) 求a的b次幂,如果有第三个参数,则取幂之后对第三个值取余并返回
max() 求最大值
min() 求最小值
sum() 求和
-
列表和元祖
list() 将一个可迭代对象转化成列表
tuple() 将一个可迭代对象转换成元祖
reversed() 将一个序列反转,返回反转后的序列的迭代器对象
slice() 列表的切片
-
字符串相关
str() 将数据转换成字符串类型
format() 与具体数据相关,⽤于计算各种⼩数, 精度等
# 浮点数保存两位小数 print(format(1.23456, ".2f")) # 1.23
bytes() 将数据转换成bytes类型
content = "哈哈" ret = content.encode("utf-8") print(ret) # b'xe5x93x88xe5x93x88' content = "哈哈" bs = bytes(content, encoding = "utf-8") print(bs) # b'xe5x93x88xe5x93x88'
repr() 返回对象的string形式
# repr 就是原封不动的输出, 引号和转义字符都不起作⽤,但是对%s格式化输出不起作用 print(repr("我是 啊哈哈“嘿嘿”")) # 我是 啊哈哈“嘿嘿” print(repr("我是一个%s" % "大帅比")) # 我是一个大帅比
-
数据集合
dict() 创建一个字典
set() 创建一个集合
frozenset() 创建一个冻结的集合,冻结的集合不能进行添加和删除操作
-
其它相关
len() 获取一个对象中元素的个数
enumerate() 获取集合的枚举对象
lst = ["dogfa", "djb", "oldniu"] for index, data in enumerate(lst, 1): print(index, data) # 1 dogfa # 2 djb # 3 oldniu
all() 可迭代对象中的元素全部为True则返回True
any() 可迭代对象中的一个元素为True则返回True
lst = [1, "xixi", True] print(all(lst)) # True print(any(lst)) # True lst = [1, "xixi", True, False] print(all(lst)) # False print(any(lst)) # True
zip() ⽤于将可迭代的对象作为参数, 将对象中对应的元素打包成⼀个个元组,然后返回由这些元组组成的迭代器对象。 如果各个可迭代对象中的元素个数不⼀致, 则返回列表⻓度与最短的对象相同。
lst1 = [1, "dogfa", True] lst2 = [2, "dog", 3, [1, 2, 3]] lst3 = [[4, 5, 6], False, "嘻嘻", "嘿嘿", 2] print(zip(lst1, lst2, lst3)) # (1, 2, [4, 5, 6]) # ('dogfa', 'dog', False) # (True, 3, '嘻嘻')
ord() 输入字符找带字符编码的位置
chr() 输入位置数字找出对应的字符
ascii() 是ascii码中的返回该值 不是就返回u...# 找到对应字符的编码位置 print(ord('a')) print(ord('中')) # 找到对应编码位置的字符 print(chr(97)) print(chr(20013)) # 在ascii中就返回这个值. 如果不在就返回u... print(ascii('a')) print(ascii('好'))
二、匿名函数
lambda匿名函数:为了解决一些简单的需求而设计的一句话函数
lambda匿名函数语法:函数名 = lambda 参数: 返回值
# 计算n的n次方
def func(n):
return pow(n, n)
print(func(4))
# 256
f = lambda n:pow(n, n)
print(f(4))
# 256
注意:
- 函数的参数可以有多个, 多个参数之间⽤逗号隔开
- 匿名函数不管多复杂。 只能写⼀⾏, 且逻辑结束后直接返回数据
- 返回值和正常的函数⼀样, 可以是任意数据类型
匿名函数并不是说⼀定没有名字。这⾥前⾯的变量就是⼀个函数名, 说他是匿名原因是我们通过__name__查看的时候是没有名字的。统⼀都叫lambda, 在调⽤的时候没有什么特别之处,像正常的函数调⽤即可。
三、sorted(),filter(),map()
-
sorted():排序函数
语法:sorted(Iterable, key=None, reverse = False)
Iterable:可迭代对象
key:排序规则(排序函数),在sorted内部会将可迭代对象中的每⼀个元素传递给这个函数的参数, 根据函数运算的结果进⾏排序。
reverse:是否翻转,排序之后翻转可以理解额为是否倒序。True倒序,False正序。
# 根据字符串长度对列表进行排序 lst = ["哈哈", "我很长哦", "我是最长的谁不服来比试比试最后的结果排名", "我赵日天不服", "我叶良成也不服"] def compare_length(data): return len(data) ret = sorted(lst, key=compare_length,reverse=True) print(ret) # ['我是最长的谁不服来比试比试最后的结果排名', '我叶良成也不服', '我赵日天不服', '我很长哦', '哈哈'] # 接下来结合匿名函数实现 lst = ["哈哈", "我很长哦", "我是最长的谁不服来比试比试最后的结果排名", "我赵日天不服", "我叶良成也不服"] ret = sorted(lst, key=lambda data:len(data),reverse=True) print(ret) # ['我是最长的谁不服来比试比试最后的结果排名', '我叶良成也不服', '我赵日天不服', '我很长哦', '哈哈'] # 以上的结果是一样的,在某些情况下我们可以使用匿名函数来定义key的排序规则 # 根据年龄对列表中的字典进行排序 lst = [ {"name":"dogfa", "age":18}, {"name":"djb", "age":11}, {"name":"oldniu", "age":23}, {"name":"cdj", "age":38}, ] ret = sorted(lst, key=lambda dic:dic["age"]) print(ret) # [{'name': 'djb', 'age': 11}, {'name': 'dogfa', 'age': 18}, {'name': 'oldniu', 'age': 23}, {'name': 'cdj', 'age': 38}]
补充:
permission_menu_dict = {
1: {
'menu_title': '信息管理',
'menu_icon': 'fa fa-address-book-o',
'weight': 1,
'children': [{
'menu_id': 1,
'permission_title': '客户列表',
'permission_url': '/customer/list/'
}]
},
2: {
'menu_title': '财务管理',
'menu_icon': 'fa fa-money',
'weight': 2,
'children': [{
'menu_id': 2,
'permission_title': '缴费记录',
'permission_url': '/payment/list/'
}]
}
}
for i in sorted(permission_menu_dict, key=lambda key:permission_menu_dict[key]['weight'], reverse=True):
print(permission_menu_dict[i])
# 字典默认将key传入, 返回值也是key
-
filter():筛选函数,返回的值是一个迭代器
语法:filter(function, Iterable)
function: ⽤来筛选的函数,在filter中会⾃动的把iterable中的元素传递给function,然后根据function返回的True或者False来判断是否保留此项数据
Iterable: 可迭代对象
# 筛选lst中的奇数 lst = [i for i in range(100)] print(list(filter(lambda data:data % 2 == 1, lst))) # 筛选年龄大于20的数据 lst = [ {"name":"dogfa", "age":18}, {"name":"djb", "age":11}, {"name":"oldniu", "age":23}, {"name":"cdj", "age":38}, ] print(list(filter(lambda dic:dic["age"] > 20, lst))) # [{'name': 'oldniu', 'age': 23}, {'name': 'cdj', 'age': 38}]
-
map():映射函数,返回的值是一个迭代器
语法:map(function, Iterable)
可以对可迭代对象中的每⼀个元素进⾏映射,分别取执⾏function
# 对列表中的每个元素取平方,重新返回列表 lst = [i for i in range(6)] print(list(map(lambda data:pow(data, 2), lst))) # [0, 1, 4, 9, 16, 25] # 计算两个列表相同位置的数据的和 lst = [1, 2, 3, 4, 5] lst2 = [10, 11, 12, 13, 14, 15, 16, 17, 18] print(list(map(lambda data1, data2: data1 + data2, lst, lst2))) # [11, 13, 15, 17, 19]
四、递归
递归:在函数中调用函数本身,就是递归。
# 递归
def func():
print("666")
func()
func()
# 在Python中递归的最深度为998
def func(depth):
print(depth)
func(depth+1)
func(1)
# RecursionError: maximum recursion depth exceeded while calling a Python object
# 到达递归的最大层时会报错
递归的应用:可以使用递归来遍历各种树形结构,比如文件目录。
# 使用递归遍历文件夹中的所有文件
import os
def read_file(file_path, depth):
files = os.listdir(file_path) # 获取当前文件夹中的所有文件和子文件夹
for file in files:
new_file_path = os.path.join(file_path, file) # 获取文件夹中的文件和杂文件夹的路径
if os.path.isdir(new_file_path): # 如果子文件是文件夹
print(" " * depth, file)
read_file(new_file_path, depth + 1)
else:
print(" " * depth, file)
print(read_file("C:\UsersAdministratorDesktop", 0))
# 还可以使用递归进行二分查找
lst = [1, 45, 98, 100, 125, 135, 146, 198, 199, 500, 988, 1000, 1546, 2000]
def binary_search(left, right, n):
middle = (left + right) // 2
if left > right:
return -1
if n > lst[middle]:
left = middle + 1
elif n < lst[middle]:
right = middle - 1
else:
return middle
return binary_search(left, right, n)
index = binary_search(0, len(lst) - 1, 988)
print("查找的数据:{0},索引:{1}".format(lst[index], index))
# 查找的数据:988,索引:10