内置函数 闭包

内置函数 闭包

内置函数

匿名函数 lambda

构建格式 (一句话函数)

  • 适用于简单的函数
func = lambda a,b : a if a > b else b
# lambda == def  a,b是形参 返回值用 ":"隔开  ":" 是返回值(可以加判断条件)
 print(func(5,2))

func = lambda lis : (lis[0],lis[2])  # 返回值多个元素用元组表达
print(func("sadas"))

func = lambda : 3
print(func()) # 3 (返回值)

注意事项(格式化输出F/f'strings' )

# 所以使用lambda 表达式会出现一些问题。
# 解决方式:可将lambda嵌套在圆括号里面解决此问题。
x = 5
print(f'{(lambda x: x*2) (x)}')  # 10

内置函数Ⅰ

eval 执行字符串类型的代码,并返回最终结果 有返回值 (谨慎使用)

print(eval("1+2")) # 脱掉str的外套, 进行int运算  # 打印结果 3

exec 执行字符串类型的代码 代码流 过程 没有返回值 (谨慎使用)

s ='''
for i in [1,2,3]:
    print(i)
'''  # 与eval相似 但没有返回值
exec(s) # 1 2 3  
print(exec(s)) # None

hash 获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值。

print(hash(12322))
print(hash('alex'))
print(hash(True))
'''
12322
4259238228040858354
1''' # 打印结果

help 函数用于查看函数或模块用途的详细说明。

print(help(list))  # 就是按着ctrl 看函数内部解释运行原理
print(help(str.split))

callable() (对象是否可调用)

  • 函数用于检查一个对象是否是可调用的。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。
name = 'alex'
def func():
    pass
print(callable(name))  # False
print(callable(func))  # True

int () ( "12" → 12 / 12.2 → 12 )

  • 函数用于将一个字符串或数字转换为整型。 将浮点型转化为整型
print(int())  # 0
print(int('12'))  # 12
print(int(3.6))  # 3
print(type(bin(3.6)))  # class"int" 

float () ( 3→3.0 )

  • 函数用于将整数和字符串转换成浮点数。
print(float(1)) # 1.0

bin () ( 10 → 2 进制 )

  • 将十进制整数转换成二进制并返回。
print(bin(100)) # 将十进制转化成二进制 0b1100100
print(type(bin(3)))  # class"str" 

oct () ( 10 → 8 进制 )

  • 将十进制转化成八进制字符串并返回。
print(oct(10),type(oct(10)))  # 0o12 <class 'str'>

hex () ( 10 → 16 进制 )

  • 将十进制转化成十六进制字符串并返回。
print(hex(10),type(hex(10)))  #16进制 0xa <class 'str'> 10,11,12,13,14,15 分别用a,b,c,d,e,f表示

divmod () (a // b , a % b ) 分页用

  • 计算除数与被除数的结果,返回一个包含商和余数的元组(a // b, a % b)。
print(divmod(7,2))  # (3, 1)
print(divmod(2,2))  # (1, 0)

round () (保留有效位数)

  • 保留小数的有效位数
print(round(7/3,2))  # 2.33
print(round(7/3))  # 2
print(round(3.32567,3))  # 3.326

pow () (x**y)

  • 求xy次幂。(三个参数为x**y的结果对z取余)
print(pow(2,3))  # 8  (两个参数为2**3次幂)
print(pow(2,3,3)) # 2(三个参数为2**3次幂,对3取余)

ord () (查unicode中编码位置)

  • 输入字符找该字符在unicode中编码的位置
# ord 输入字符找该字符编码的位置
print(ord('a')) # 97
print(ord('中')) # 20013

chr () (查unicode中对应位置)

  • 输入位置数字找出其unicode中对应的字符
# chr 输入位置数字找出其对应的字符
print(chr(97)) # a
print(chr(20013)) # 中

repr () (%r 原形毕露)

  • 返回一个对象的string形式(原形毕露)。
mag ="我叫%r" %(太白)
print(mag)  # 我叫"太白"
# %r  原封不动的写出来
# name = 'taibai'
# print('我叫%r'%name)

# repr 原形毕露
print(repr('{"name":"alex"}'))
print('{"name":"alex"}')

all () ( 判断可迭代对象 )

  • 判断可迭代对象中,全都是True才是True

any () ( 判断可迭代对象 )

  • 判断可迭代对象中,有一个True 就是True
# all  可迭代对象中,全都是True才是True
# any  可迭代对象中,有一个True 就是True
print(all([1,2,True,0]))
print(any([1,'',0]))

内置函数Ⅱ

# sep:   打印多个值之间的分隔符,默认为空格
# end:   每一次打印的结尾,默认为换行符 \n
# file:  默认是输出到屏幕,如果设置为文件句柄,输出到文件
print(1, 2, 3, sep='|') # 1|2|3

print(1, 2, end=' ') # 1 2 3 4
print(3, 4) # 两句话一起打印在一行

f = open('log','w',encoding='utf-8')
f.write('写入文件') == print('写入文件', file=f) 

int():pass

str():pass

bool():pass

set(): pass

list()

  • 将一个可迭代对象转换成列表
l1 = list('abcd')
print(l1)  # ['a', 'b', 'c', 'd']
print(list("abcd"))

tuple()

  • 将一个可迭代对象转换成元组
tu1 = tuple('abcd')
print(tu1)  # ('a', 'b', 'c', 'd')

dict()

  • 通过相应的方式创建字典
# 创建字典的几种方式
dic = {1: 2}
# 字典推导式
print({i: 1 for i in range(3)})
dic = dict(one=1, two=2, three=3)
# 从键
dic = dict.fromkeys()

abs() 返回绝对值

print(abs(-10)) # 10

sum(Iterable object) 求和

print(sum([1,2,3])) # 6 
print(sum((1,2,3),100)) # 106

max / min() 求最值

print(min([22, 11, 45, 2])) # 2
# min / max 可加功能
dic = {'a':3,'b':2,'c':1}
# 将dic值最小的键返回。
print(min(dic,key=lambda x : dic[x]))

# 将dic值最小的值返回。
print(dic[min(dic,key=lambda x : dic[x])])

dic = {'a':['李业',67],'b':['怼哥', 95],'c':['方垚', 85]}

# 将成绩最低的从属于的那个列表返回。
print(dic[min(dic,key=lambda x : dic[x][1])])

# 将成绩最低的分数返回。
print(dic[min(dic,key=lambda x : dic[x][1])][1])

reversed() 镜像

  • 将一个序列翻转, 返回翻转序列的迭代器
print(reversed([1,2,3,4]))  # 返回值是一个迭代器(生成器)
print(list(reversed([1,2,3,4]))) # [4,3,2,1]

bytes()

  • 把字符串转换成bytes类型
s1 = '太白'
方法一:
print(s1.encode('utf-8'))
方法二:
print(bytes(s1,encoding='utf-8'))

解码:
b1 = b'\xe5\xa4\xaa\xe7\x99\xbd'
# 方法一:
# print(b1.decode('utf-8'))
# 方法二:
print(str(b1, encoding='utf-8'))

zip() 拉链方法

  • 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元祖组成的内容,如果各个迭代器的元素个数不一致,则按照长度最短的参数索引返回
lst1 = [1,2,3]
lst2 = ['a','b','c','d']
lst3 = (11,12,13,14,15)
print(zip(lst1)) # 结果是一个迭代器
for i in zip(lst1,lst2,lst3):
    print(i)
# 结果:
(1, 'a', 11)
(2, 'b', 12)
(3, 'c', 13) 

sorted排序函数 (默认从小到大)

l1 = [2, 6, 4, 1, 3]
#  列表原有的方法
l1.sort()
print(l1)  # [1, 2, 3, 4, 6]

#  形成新列表
print(sorted(l1)) # [1, 2, 3, 4, 6]
print(l1) # [2, 6, 4, 1, 3]

#  reverse : 是否是倒叙 ,True 倒叙  ; False 正序

# 结合lambda 使用  (字典返回的是key)
l1 = [('张一东', 80), ('张耳洞', 75), ('怼怼哥', 7), ('李业', 59)]
print(sorted(l1,key=lambda x:x[1])) # 或者
print(sorted(l1,key=lambda x:x[1],reverse=False))
print(sorted(l1,key=lambda x:x[1],reverse=True))

filter() 筛选过滤

# 生成器表达式的筛选模式
l1 = [56, 67, 12, 34, 78, 90,]
print([i for i in l1 if i > 60]) # [67, 78, 90]
# 返回值为True的留下来
print(filter(lambda x: x>60,l1))  # 返回一个迭代器 / 生成器
print(list(filter(lambda x: x>60,l1))) # [67, 78, 90]

lst = [{'id':1,'name':'alex','age':50},
        {'id':1,'name':'wusir','age':17},
        {'id':1,'name':'taibai','age':16},]

print(list(filter(lambda x:x['age']<30,lst))) 

map() 统计可迭代类

l1 = [56, 67, 12, 34, 78, 90,] 
print([i**2 for i in l1])  # [3136, 4489, 144, 1156, 6084, 8100]
print(map(lambda x:x**2,l1))  # 返回一个生成器
print(list(map(lambda x:x**2,l1))) # [3136, 4489, 144, 1156, 6084, 8100]
#  计算两个列表中相同位置的数据的和
lst1 = [1, 2, 3, 4, 5]
lst2 = [2, 4, 6, 8, 10]
print(list(map(lambda x, y: x+y, lst1, lst2)) # [3, 6, 9, 12, 15]

reduce() 统计类

from functools import reduce # 先得调用
''' 
第一次:x,y 1,2 求和 3 记录到内存
第二次:x,y 3,3 求和 6 记录到内存
第三次:x,y 6,4 .........'''
print(reduce(lambda x,y: x+y,[1,2,3,4,5])) # 1+2+3+4+5 
print(reduce(lambda x,y: 2*x+y, [1,2,3]))
print(reduce(lambda x,y: x+y, ['alex','s','b']))  # 可以用字符串拼接  alexsb

enumerate() 枚举

解包和枚举
s = "wtf"
d = {}
for i, d[i] in enumerate(s):
    pass
print(d)# 打印结果: {0:"w",1:"t",2:"f"}

闭包

  • 闭包就是内层函数中, 对外层函数(非全局)变量的调用(引用 / 改变). 叫闭包
  • 可以让一个局部变量(自由变量)常驻内存

作用

  • 应用于装饰器
  • 最终的目的是保证了数据的安全
  • 可以保证外层函数中的变量在内存中常驻,供后面的程序使用

闭包的形成条件

  • 闭包存在于嵌套函数中
  • 内层函数对外层函数非全局变量引用(改变)
  • 参考 : 函数名逐层返回直至返回到最外层

特性

  • 闭包函数的空间不会随着函数函数的结束而消失
  • 被内层函数引用的(非全局)变量不会消失(常驻内存)

自由变量

  • 外层函数被内层函数引用的变量被称为

判断是不是闭包 == 是不是有自由变量

print(外部函数名()._ code _.co_freevars 查看函数的自由变量)

print(外部函数名()._ code _.co_varnames 查看函数的局部变量)

def make_averager():
    series = []
    def averager(new_value):
        series.append(new_value)
        total = sum(series)
        return total/len(series)
    return averager
avg = make_averager()

# 函数名.__code__.co_freevars 查看函数的自由变量
print(avg.__code__.co_freevars)  # ('series',)
当然还有一些参数,仅供了解:

# 函数名.__code__.co_freevars 查看函数的自由变量
print(avg.__code__.co_freevars)  # ('series',)
# 函数名.__code__.co_varnames 查看函数的局部变量
print(avg.__code__.co_varnames)  # ('new_value', 'total')
posted @ 2019-06-15 22:30  樊xs  阅读(139)  评论(0编辑  收藏  举报