day 12 内置函数,装饰器,递归函数
内置函数
内置函数:python给咱们提供了一些他认为你会经常用到的函数,68种
内置函数 | ||||
abs() | dict() | help() | min() | setattr() |
all() | dir() | hex() | next() | slice() |
any() | divmod() | id() | object() | sorted() |
ascii() | enumerate() | input() | oct() | staticmethod() |
bin() | eval() | int() | open() | str() |
bool() | exec() | isinstance() | ord() | sum() |
bytearray() | filter() | issubclass() | pow() | super() |
bytes() | float() | iter() | print() | tuple() |
callable() | format() | len() | property() | type() |
chr() | frozenset() | list() | range() | vars() |
classmethod() | getattr() | locals() | repr() | zip() |
compile() | globals() | map() | reversed() | __import__() |
complex() | hasattr() | max() | round() | |
delattr() | hash() | memoryview() | set() |
按星级划分
❤ ❤ ❤ 死记
locals :函数会以字典的类型返回当前位置的全部局部变量(函数中,返回函数内的变量。函数外,返回全局变量)
globals:函数以字典的类型返回全部全局变量
a = 1
b = 2
def func():
name = 'alex'
age = 12
print(locals()) # {'age': 12, 'name': 'alex'} 局部变量
print(globals()) # {'__name__': '__main__', '__doc__': None, ... 'a': 1, 'b': 2}
func()
globals/locals
input: 函数接受一个标准输入数据,返回为 string 类型。
pass
print: 打印输出。(step= ‘ ’, end=' ' )
print('alex','echo', sep='|') # alex|echo 默认是空格
print('', end=' ') # 123 456 不换行
print('')
print用法
open:用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写。
pass
callable:用于检查一个对象是否是可调用的。True 可调用,False 不可调用
a = 1
def func():
pass
func()
print(callable(func)) #func可调用
print(callable(a)) # False
dir:函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。
l1 = [1 ,2 ,3 ,4]
print(dir(l1)) # 可以看到__iter__
range:函数可创建一个整数对象,一般用在 for 循环中
pass
next:内部实际使用了__next__方法,返回迭代器的一个值
pass
iter:函数用来生成迭代器(将一个可迭代对象,生成迭代器)
l1 = [1 ,2 ,3 ,4]
s1 = iter(l1)
for i in s1:
print(i)
bool :用于将给定参数转换为布尔类型,如果没有参数,返回 False。
pass
int:函数用于将一个字符串或数字转换为整型。
pass
divmod:计算除数与被除数的结果,返回一个包含商和余数的元组(a // b, a % b)
print(divmod(7,2)) # (3, 1) 7/2 商 3 余 1
sum:对可迭代对象进行求和计算(可设置初始值)
print(sum([1,2,3])) #
print(sum((1, 2, 3),100)) #
min:返回可迭代对象的最小值(可加key,key为函数名,通过函数的规则,返回最小值)。
dic = {'a': 3, 'b': 2, 'c': 1}
print(min(dic)) # a 键的最小值
print(min(dic, key=lambda x: dic[x])) # c 最小值得键
print(dic[min(dic, key=lambda x: dic[x])]) # 1 最小值
max:返回可迭代对象的最大值(可加key,key为函数名,通过函数的规则,返回最大值
l1 = [('a', 3), ('b', 2), ('c', 1)]
print(max(l1)) # ('c', 1)
print(max(l1, key=lambda x: x[1])) # 取三个元组,拿索引为[1]的值,比较
list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素)
pass
tuple:将一个可迭代对象转化成元祖(如果是字典,默认将key作为元祖的元素)
pass
reversed:将一个序列翻转,并返回此翻转序列的迭代器
ite = reversed(['a',2,3,'c',4,2]) # 将列表反转
print(ite) # 可迭代器<list_reverseiterator object at 0x0000020F7DA27630>
for i in ite:
print(i)
str:将数据转化成字符串
pass
bytes:用于不同编码之间的转化
s = '你好'
bs = bytes(s,encoding='utf-8')
print(bs)
dict:创建一个字典。
pass
set:创建一个集合
pass
len:返回一个对象中元素的个数。
pass
sorted:对所有可迭代的对象进行排序操作
# 按年龄排倒叙,sorted会创建一个新列表
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
l1 = sorted(students, key=lambda x:x[2], reverse=True)
print(l1)
enumerate:枚举,返回一个枚举对象
dic = {'name':'alex', 'age': 18, 'hobby':'basketball'}
for k in enumerate(dic, start=1):
print(k)
print(enumerate([1, 2, 3])) # <enumerate object at 0x000001F4D62811B0>
for i in enumerate([1, 2, 3]):
print(i, end='') # (0, 1)(1, 2)(2, 3)
for i in enumerate([1, 2, 3], 100):
print(i, end='') # (100, 1)(101, 2)(102, 3)
zip:将索引相同的元素,组成一个元组
l1 = [1, 2, 3, ]
l2 = ['a', 'b', 'c', 5]
l3 = ('*', '**', (1, 2, 3))
for i in zip(l1, l2, l3):
print(i)
# (1, 'a', '*') 把每个列表索引相同的元素,组成一个元组
# (2, 'b', '**')
# (3, 'c', (1, 2, 3))
filter:过滤·
# filter 过滤 通过你的函数,过滤一个可迭代对象,返回的是True
# 类似于[i for i in range(10) if i > 3] 列表推导式的筛选模式
def func(x): return x % 2 == 0 ret = filter(func, [1, 2, 3, 4, 5, 6, 7])
print(ret) # <filter object at 0x000001FA908F10B8>
for i in ret:
print(i) # 2, 4, 6
map:会根据提供的函数对指定序列做映射
def square(x): # 计算平方数 return x ** 2 map(square, [1, 2, 3, 4, 5]) # 计算列表各个元素的平方
# [1, 4, 9, 16, 25]
map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数
# [1, 4, 9, 16, 25] # 提供了两个列表,对相同位置的列表数据进行相加
l1 = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
print(l1) # <map object at 0x000002CEF7F420B8>
for i in l1:
print(i)
# [3, 7, 11, 15, 19]
❤❤ 记住
1.2.1 字符串类型代码的执行 eval,exec,complie 慎用
eval:执行字符串类型的代码,并返回最终结果
print(eval('1+2+3')) # n=81
eval("n + 4") # eval('print(666)') #
exec:执行字符串类型的代码。
s = '''
for i in [1,2,3]:
print(i)
'''
exec(s) # 直接执行for循环
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'。
'''
>>> #流程语句使用exec
>>> code1 = 'for i in range(0,10): print (i)'
>>> compile1 = compile(code1,'','exec')
>>> exec (compile1) >>> #简单求值表达式用eval
>>> code2 = '1 + 2 + 3 + 4'
>>> compile2 = compile(code2,'','eval')
>>> eval(compile2) >>> #交互语句用single
>>> code3 = 'name = input("please input your name:")'
>>> compile3 = compile(code3,'','single')
>>> name #执行前name变量不存在
Traceback (most recent call last):
File "<pyshell#29>", line 1, in <module>
name
NameError: name 'name' is not defined
>>> exec(compile3) #执行时显示交互命令,提示输入
please input your name:'pythoner'
>>> name #执行后name变量有值
"'pythoner'"
help:函数用于查看函数或模块用途的详细说明。
print(help(print))
__import__:函数用于动态加载类和函数
pass
hash:获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值
str = 'alex'
print(hash(str))
id:用于获取对象的内存地址
pass
float:函数用于将整数和字符串转换成浮点数
pass
bin:将十进制转换成二进制并返回。
oct:将十进制转化成八进制字符串并返回。
hex:将十进制转化成十六进制字符串并返回。
print(bin(10)) # 0b1010 二进制
print(oct(10)) # 0o12 八进制
print(hex(10)) # 0xa 十六进制
abs:函数返回数字的绝对值
print(abs(-5)) # 5 绝对值
round:保留浮点数的小数位数,默认保留整数。
print(round(7/3,2)) # 2.33 保留2位
print(round(7/3)) # 2 默认保留整数
print(round(3.32567,3)) # 3.326 保留3位
pow:求x**y次幂。(三个参数为x**y的结果对z取余
print(pow(2,3)) # 两个参数为2**3次幂
print(pow(2,3,3)) # 三个参数为2**3次幂,对3取余
frozenset:返回一个冻结的集合,冻结后集合不能再添加或删除任何元素
set1 = {1, 2, 3, 4}
set1.add(22)
set1 = frozenset(set1)
set1.add(33) # AttributeError: 'frozenset' object has no attribute 'add'
print(set1, type(set1))
all:可迭代对象中,全都是True才是True
any:可迭代对象中,有一个True 就是True
print(all([1,2,True,0])) # False
print(any([1,'',0])) # True
❤了解
complex:函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数。
pass
slice:构造一个切片对象,用于列表的切片 , 定义之后所有的列表的都会改变
li = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
sli_obj = slice(3) # 切片
print(li[sli_obj])
# ['a', 'b', 'c']
sli_obj = slice(0, 7, 2) # 切片 + 步长
print(li[sli_obj])
# ['a', 'c', 'e', 'g']
format:与具体数据相关,用于计算各种小数,精算等
#字符串可以提供的参数,指定对齐方式,<是左对齐, >是右对齐,^是居中对齐
print(format('test', '<20'))
print(format('test', '>20'))
print(format('test', '^20')) #整形数值可以提供的参数有 'b' 'c' 'd' 'o' 'x' 'X' 'n' None
>>> format(3,'b') #转换成二进制
''
>>> format(97,'c') #转换unicode成字符
'a'
>>> format(11,'d') #转换成10进制
''
>>> format(11,'o') #转换成8进制
''
>>> format(11,'x') #转换成16进制 小写字母表示
'b'
>>> format(11,'X') #转换成16进制 大写字母表示
'B'
>>> format(11,'n') #和d一样
''
>>> format(11) #默认和d一样
'' #浮点数可以提供的参数有 'e' 'E' 'f' 'F' 'g' 'G' 'n' '%' None
>>> format(314159267,'e') #科学计数法,默认保留6位小数
'3.141593e+08'
>>> format(314159267,'0.2e') #科学计数法,指定保留2位小数
'3.14e+08'
>>> format(314159267,'0.2E') #科学计数法,指定保留2位小数,采用大写E表示
'3.14E+08'
>>> format(314159267,'f') #小数点计数法,默认保留6位小数
'314159267.000000'
>>> format(3.14159267000,'f') #小数点计数法,默认保留6位小数
'3.141593'
>>> format(3.14159267000,'0.8f') #小数点计数法,指定保留8位小数
'3.14159267'
>>> format(3.14159267000,'0.10f') #小数点计数法,指定保留10位小数
'3.1415926700'
>>> format(3.14e+1000000,'F') #小数点计数法,无穷大转换成大小字母
'INF' #g的格式化比较特殊,假设p为格式中指定的保留小数位数,先尝试采用科学计数法格式化,得到幂指数exp,如果-4<=exp<p,则采用小数计数法,并保留p-1-exp位小数,否则按小数计数法计数,并按p-1保留小数位数
>>> format(0.00003141566,'.1g') #p=1,exp=-5 ==》 -4<=exp<p不成立,按科学计数法计数,保留0位小数点
'3e-05'
>>> format(0.00003141566,'.2g') #p=1,exp=-5 ==》 -4<=exp<p不成立,按科学计数法计数,保留1位小数点
'3.1e-05'
>>> format(0.00003141566,'.3g') #p=1,exp=-5 ==》 -4<=exp<p不成立,按科学计数法计数,保留2位小数点
'3.14e-05'
>>> format(0.00003141566,'.3G') #p=1,exp=-5 ==》 -4<=exp<p不成立,按科学计数法计数,保留0位小数点,E使用大写
'3.14E-05'
>>> format(3.1415926777,'.1g') #p=1,exp=0 ==》 -4<=exp<p成立,按小数计数法计数,保留0位小数点
''
>>> format(3.1415926777,'.2g') #p=1,exp=0 ==》 -4<=exp<p成立,按小数计数法计数,保留1位小数点
'3.1'
>>> format(3.1415926777,'.3g') #p=1,exp=0 ==》 -4<=exp<p成立,按小数计数法计数,保留2位小数点
'3.14'
>>> format(0.00003141566,'.1n') #和g相同
'3e-05'
>>> format(0.00003141566,'.3n') #和g相同
'3.14e-05'
>>> format(0.00003141566) #和g相同
'3.141566e-05'
bytearry:类似bytes,返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256
ret = bytearray('alex',encoding='utf-8')
print(id(ret)) #
print(ret) # bytearray(b'alex')
print(ret[0]) # 97 a的ascii码
ret[0] = 65
print(ret) # bytearray(b'Alex')
print(id(ret)) #
memoryview
ret = memoryview(bytes('你好',encoding='utf-8'))
print(len(ret)) #
print(ret) # <memory at 0x00000226AD062048>
print(bytes(ret[:3]).decode('utf-8')) # 你
print(bytes(ret[3:]).decode('utf-8')) # 好
ord:输入字符找该字符编码的位置
chr:输入位置数字找出其对应的字符
ascii:是ascii码中的返回该值,不是就返回/u..
# ord 输入字符找该字符编码的位置
print(ord('a')) #
print(ord('中')) # # chr 输入位置数字找出其对应的字符
print(chr(97)) # a
print(chr(20013)) # 中 # 是ascii码中的返回该值,不是就返回\u...
print(ascii('a')) # a
print(ascii('中')) # '\u4e2d'
repr:返回一个对象的string形式(原形毕露)
a = 'nihao '
print(a) # nihao
print(repr(a)) # 'nihao '
装饰器
装饰器: 装饰器的本质是闭包,而且装饰器其实就是一个函数
装饰器:在不改变原函数调用方式上,给原函数增加一些额外的功能。登录验证,写日志,执行效率等时候使用
开放封闭原则:
对外扩展开放
为什么要对扩展开放呢?
我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。
对内修改封闭 (不允许修改函数)
就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户
装饰器完美的遵循了这个开放封闭原则。
# 装饰器的标准格式
def wrapper(f): # f = func
def inner(*args, **kwargs):
'''执行被装饰函数之前的操作'''
ret = f(*args, **kwargs)
# ret = func(*args, **kwargs) ; func()函数开始运行
'''执行被装饰函数之后的操作'''
return ret # 将返回值返回给执行者 inner(),也就是func()
return inner
def wrapper(f): # f = func
def inner(*args, **kwargs):
'''执行被装饰函数之前的操作'''
ret = f(*args, **kwargs)
# ret = func(*args, **kwargs) ; func()函数开始运行
'''执行被装饰函数之后的操作'''
return ret # 将返回值返回给执行者 inner(),也就是func()
return inner @wrapper # func = wrapper(func); wrapper()函数开始运行
def func():
print(666)
func() # func() = inner() ; inner()函数开始运行
递归函数
import sys
sys.setrecursionlimit(100000)
def func(n):
n += 1
print(n)
func(n)
func(96778)
递归函数,会在内存空间不断开辟新的内存空间,直到占满
import os
# 遍历该路径下的所有文件
file_list = os.listdir('D:\python')
print('file_list')
读取一个文件下的所有文件和目录
import os def read(path, n):
file_list = os.listdir(path) # 获取目录下所有文件和目录,通过list返回
for file in file_list:
file_path = os.path.join(path, file) # 将上级文件路径与文件拼接,返回文件路径
if os.path.isdir(file_path): # 判断文件是否是目录
print(' ' * n, file)
read(file_path, n + 1)
else:
print(' ' * n, file) read('D:\study', 0)
day 12 内置函数,装饰器,递归函数的更多相关文章
- Python 4 函数的参数,内置函数,装饰器,生成器,迭代器,
一.函数的参数: 1.位置参数:调用函数时根据函数定义的参数位置来传递参数. 2.关键字参数:用于函数调用,通过“键-值”形式加以指定.可以让函数更加清晰.容易使用,同时也清除了参数的顺序需求. 3. ...
- Python---12函数式编程------12.3匿名函数&装饰器&偏函数
一.匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时,除了定义一个f( ...
- django 内置用户-装饰器
""" 一.如何给python内置用户添加额外的字段,注意一定义在没有迁移数据之前定义,否则会报错 1.在models中先调用 from django.contrib.a ...
- Python—内置三大装饰器(@staticmethod、@classmethod、@property)
https://blog.csdn.net/weixin_42681866/article/details/83376484 https://blog.csdn.net/weixin_43265804 ...
- python学习之路-4 内置函数和装饰器
本篇涉及内容 内置函数 装饰器 内置函数 callable() 判断对象是否可以被调用,返回一个布尔值 1 2 3 4 5 6 7 8 9 10 11 num = 10 print(callabl ...
- Python开发【第四篇】: 三大器和内置函数
内容概要 函数名 闭包 迭代器 生成器 推导式与表达式 内置函数 装饰器 初识递归 1.函数名 函数名的运用: 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量. 01. 函数名的 ...
- Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器)
Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器) 1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数
- Python之函数目录(自定义函数,内置函数,装饰器,迭代器,生成器)
1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数 9.函数相关定义 10.三元表达式.列表推导式.生成器表达式 11.函数与方法的区别
- Python菜鸟之路:Python基础-内置函数补充
常用内置函数及用法: 1. callable() def callable(i_e_, some_kind_of_function): # real signature unknown; restor ...
随机推荐
- 1047A_Little C Loves 3 I(构造)
A. Little C Loves 3 I time limit per test 1 second memory limit per test 256 megabytes input standar ...
- MYSQL数据库中,常见的数据类型有哪些?它们与java中的数据类型如何对应
A.常规 映射 integer 或者 int int 或者 java.lang.Integer INTEGER 4 字节 long long Long BIGINT 8 字节 short short ...
- 118/119. Pascal's Triangle/II
原文题目: 118. Pascal's Triangle 119. Pascal's Triangle II 读题: 杨辉三角问题 '''118''' class Solution(object): ...
- [jQ]使用jQuery将多条数据插入模态框的方法
---------------------------------------------------------------------------------------------------- ...
- [原创]delphi在win7下创建共享文件夹源代码
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- week06 09 NodeJS Server as a RPCclient - jayson
nodeserver端的rpcclient 来调用后端backendserver端定义的add等方法 2个server连通 Make NodeJs as a client - Npm jayson 用 ...
- linux下json工具jq
1.查看json文件 [root@VM-1-10-11 f46c19f56252a74a46fd30026001e62cc5ecadd04bc9a80c47f6fd5f9dc0586b]# pwd / ...
- ajax跨域名
跨域环境模拟: 修改host文件 三种解决的方案 1:ifram(display:none) 2:jsonp(注意是只是适合的是get请求) 生成一个带有src的script标签, 3:cros(后台 ...
- ArcGIS案例学习笔记-栅格数据分区统计(平均高程,污染浓度,污染总量,降水量)
ArcGIS案例学习笔记-栅格数据分区统计(平均高程,污染浓度,污染总量,降水量) 联系方式:谢老师,135-4855-4328,xiexiaokui@qq.com 目的:针对栅格数据,利用多边形面要 ...
- js 遍历行和列
]; //遍历列 ; i < table.rows[].cells.length; i++) { console.log(table.rows[].cells[i].innerText); ]. ...