Python学习之路---内置函数和匿名函数

内置函数 共有68个
某个方法属于某个数据类型的变量,就用.调用
如果某个方法不依赖于仍和数据类型的,就直接调用 --- 内置函数和自定义函数

与作用域相关的2个 locals() globals()

locals()  # 查看本地作用域内中的所有名字
globals()  # 查看全局作用域内的所有名字

迭代器\生成器相关的3个 next() iter() range()

next(迭代器)
iter(可迭代的) #生成一个迭代器
range()  # 确定是一个可迭代的,而不是迭代器 # iter(range(10)) 转换为迭代器

其他相关的内置函数12个
A 查看内置属性 1个 dir()

dir() # 查看一个变量拥有的所有方法

B 调用相关 1个 callable()

callable() # 检验一个变量名,是否为可执行的函数
print(callable(print))
a = 1
print(callable(a))
def b():
    print('hehe')
print(callable(b))

C 帮助相关 1个 help()

help() # 查看帮助文档
help(str)

D 模块相关 1个 import

import  # 导入模块
import OS

E 文件操作相关 1个 open()

open() # 打开文件,拿到文件句柄

F 内存相关 2个 id() hash()

id() # 代表了一个变量的内存地址
hash() # 判断变量类型能否为可哈希的对象,不可哈希的数据类型就会报错,可哈希数据类型为不可变数据类型
对于相同可hash的数据的hash值再一次程序的执行过程中总是不变的
print(hash(123))
print(hash([]))
#字典的查找Key对应的Value 与hash有关

G 输入输出相关 2个 input() print() 

input() # 用户输入,不输入就不再往下执行
print() # 每一次打印自动再末位添加一个换行符\n
#指定输出的结束符
print('skjfdksjflkjs\n',end='')
print('skjfdksjflkjs\n')
print('skjfdksjflkjs\n',end='')
print('skjfdksjflkjs\n')
print('skjfdksjflkjs\n',end='')
#指定输出多个值之间的分隔符
print(1,2,3,4,5,sep='|')

#打印输出位置改变,默认输出到屏幕  #感觉好像挺有用的
f = open('file','w')
print('hello',file=f)
f.close
#flush: 立即把内容输出到流文件,不作缓存

一个有趣的例子:使用print()功能打印进度条

H 字符串代码的执行 3个 eval() exec() compile()

eval() 常用于简单计算,且有返回值

test = '1+2+3'
print(eval(test))

exce()常用于简单流程控制,无返回值

test = '''
for i in range(10):
    print(i)
'''
exec(test)
# print(exec(test)) #返回None

eval()和exce()都可以执行字符串类型的代码,两者的区别在于eval()有返回值,exec()没有返回值

eval('print(123)')
exec('print(123)')
print(eval('1+2+3+4'))  # 有返回值
print(exec('1+2+3+4'))  # 没有返回值

compile() 将字符串的代码进行编译,但是最终还是需要调用eval()、exec()

# 流程控制
test = 'for i in range(0,10):print(i)'
compile1 = compile(test,'','exec')
exec(test)
# 简单计算
test1 = '1+2+3'
compile2 = compile(test1,'','eval')
print(eval(test1))
# 用户交互 必须使用single
test3 = 'name = input("请输入你的用户名:")'
compile3 = compile(test3,'','single')
exec(test3)
print(name) # name 通过编译后产生了

 基础数据类型相关38个,其中和数字相关的14个,和数据结构相关的24个

和数字相关的14个,其中数据类型4个,进制转换3个,数学运行7个

数据类型4个 bool()-布尔型 int()-整型 float()-浮点型 complex()-复数 只在数据类型强制转换的时候才用

complex --- 复数 ---复合的数
例子:5+12j 复数无法比较大小
# 浮点数,是根据科学计数法来的 
# 314.11= 3.1411*10**2=31.411*10 (小数点飘浮)

进制转换3个 bin() oct() hex()

print(bin(10))  # 二进制转换 0b开头
print(oct(10))  # 八进制转换 0o开头
print(hex(10))  # 十六进制转换 0x开头

数学运算7个 abs()-绝对值 divmod()-除余 round()-小数的精确 pow()-幂运算 sum()-求和 min()-求最小值 max()-求最大值

数学预算7个

和数据相关的共有24个,其中序列有13个,数据集合有3个,相关内置函数8个

序列里有13个,其中列表和元组2个,相关内置函数2个,字符串9个

 列表和元组2个 list() tuple()

# 仅在数据类型强制转换的时候使用
list 不可哈希
tuple 可哈希,不可修改

相关内置函数2个 reversed()-反转 slice()-切片

reversed() 反转功能,返回值是一个迭代器,可节省内存空间
#保留原来的列表,返回一个反向的迭代器
l = [1,2,3,4,5]
l2 = reversed(l)
print (l2)
l3 = []
for i in l2:
    l3.append(i)
print(l)
print(l3)
# slice() 切片
l = [1,2,333,444,555,666]
sli = slice(1,5,2)
print(l[sli])
print(l[1:5:2])

字符串相关的有9个 format()-格式化输出 bytes()-转换成bytes类型 bytearry() menoryview() ord() chr() ascil() repr()

#format() 格式化输出
print(format('test','<20'))  # 开20个空间 向左对齐
print(format('test','>20'))  # 开20个空间 向右对齐
print(format('test','^20'))  # 开20个空间 居中对齐

# bytes() 转换bytes类型
# 所有数据读到内存里,都是Unicode
# 需求:我拿到的是GBK编码,想转换成UTF-8
# 思路:先解码decode成Unicode,在bytes成想要的编码类型
print(bytes('你好',encoding='GBK')) # Unicode转为GBK
print(bytes('你好',encoding='UTF-8'))  # Unicod 转为UTF-8
print(bytes('你好',encoding='GBK').decode('GBK')) # Unicode转为GBK,然后解码成GBK
# 用途
# 网络编程 只能传二进制
# 文件存储
# 照片和视频也是以二进制存储
# html网页爬取到的数据也是bytes编码

#bytearry() 
# 可以通过切片修改对应的字节,修改的时候可以节省内存,仅可以通过字符编码来修改
b_array = bytearray('你好',encoding='UTF-8')
print(b_array) 
print(b_array[0])

# menoryview() 
# 切片 -->字节类型,不占内存,仅切给你看,而且切出来的是字节类型,如果转为其他编码又占空间了

# ord()  
#字符按照Unicode转数字 
print(ord('a'))
print(ord('你好'))

# chr()
# 数字按照Unicode转字符 
print(chr(99))

# ascii()
# 只要是ascii码中的内容,就打印出来,不是就转换为\u
print(ascii('你好'))
print(ascii('123‘’))
# repr()
# 会让变量原封不动的输出出来,也用于格式化输出%r
name = 'egg'
print('Hello %s'%name)
print('Hellor %r'%name)

print(repr(1))  # int
print(repr('1'))  # str

数据集合有3个,其中字典1个,集合2个

字典1个 dict()

# dict() 字典

集合2个 set() frozenset()

# set() 集合

# frozenset() 不可变集合  可以作为字典的key

内置函数里的最重要的几个内置函数---相关内置函数8个

len() enumerate() all() any() zip() filter() map() sorted()

# all(可迭代的)
# 可迭代对象里,有任何一个是是False就整体是False
print(all(['a','',123]))
print(all(['a',123]))
print(all([0,1123]))

#any(可迭代的)
# 可迭代对象里,有任何一个是True就整体是True
print(any(['a','',123]))
print(any(['a',123]))
print(any([0,1123]))
#zip()  
# 返回一个迭代器
# 拉链,以最小单位为基准
l = [1,2,3,4]
l2 = ['a','b','c']
l3 = ('111',222,[3333])
l4 = {'k1':1,'k2':2}
for i in zip(l,l2,l3,l4):
    print(i)

 注意:

filter() 执行了filter之后的结果集合   <=  执行之前的个数
  filter只管筛选,不会改变原来的值
map() 执行过后元素个数不变
       值可能发生改变

# filter(函数名,可迭代的)  # 注意是函数名不是函数调用
# 是过滤函数 筛选
# 函数体 返回的值是True的时候 才会进行输出
# 例如,要从一个list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数
def is_odd(x):
    return  x % 2 ==1

ret = filter(is_odd,[1, 4, 6, 7, 9, 12, 17])
# filter()方法会进行一个循环和调用函数的动作
# for i in [1, 4, 6, 7, 9, 12, 17]:
#     if is_odd(i):
#         print(i)
print(ret)  # 返回一个迭代器
for i in ret:
    print(i)

#利用filter(),可以完成很多有用的功能,例如,删除 None 或者空字符串或者空列表,空字典等等:
# 思路,主要是看你函数怎么判读
# map()
#Python中的map函数应用于每一个可迭代的项,返回的是一个结果list。如果有其他的可迭代参数传进来,
# map函数则会把每一个参数都以相应的处理函数进行迭代处理。
# map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
ret = map(abs,[1,-2,-3,4])
# 等同于[abs(i) for i in [1,-2,-3,4]]
print(ret)
for i in ret:
    print(i)
# sorted() 排序方法
#会产生一个新的列表,适用于数据量小的列表,对于数据量大时慎用,因为会占用内存空间
# 特点是不改变原列表,产生一个新的列表,缺点是占用内存
l = [1,2,-1,3,-5,6]
l.sort(key=abs) #在原列表的基础上进行排序
print(l)
print(sorted(l,key=abs, reverse=True)) # 生成了一个新的列表
print(l)

# 需求:列表按照每个元素的len排序
l = ['hello',[1,23,4],(1,2,3,4,5,6),{'k1':1}]
print(sorted(l,key=len))

匿名函数:为了解决那些功能很简单的需求而设计的一句话函数
格式 :  函数名 = lambda 参数:返回值
    关键字 lambda,而且不允许换行,切冒号后面的语句必须为一个可执行的逻辑
    参数可以多个,用逗号隔开
    匿名函数不管逻辑多复杂,只能写一行,切逻辑执行结束后的内容就是返回值
    返回值和正常的函数一样可以是任意数据类型
带key的内置函数:min max filter map sorted   均可以与lambda使用

#一个自定义函数
def calc(n):
    return n**n
print(calc(10))

# 转换为匿名函数
calc = lambda n:n**n
print(calc(10))

# 自定义一个简单函数
def add(x,y):
    return x+y

add = lambda x,y:x+y
print(add(1,2))
#需求,在一个字典里取最大的Value,返回对应的key
#
dic = {'k1':10,'k2':100,'k3':30}
#def func(k):
 #   return dic[k]
#转换为匿名函数
#func = lambda k:dic[k]
#print(max(dic,key=func))
print(max(dic,key = lambda k:dic[k]))
# 解释一下代码
res = filter(lambda x: x > 10, [5, 8, 11, 9, 15])
for i in res:
    print(i)

#解析:筛选列表中大于10的数字并答应
# 思路:先将filter拆解,因为会执行for循环将可迭代里的元素一个个取出来:filter(函数名,可迭代的)
# 函数名 = lambda x: x > 10   可迭代的=[5, 8, 11, 9, 15]
# 匿名函数再转换
#def func(x):
#   return x >10
    
l = [5, 8, 11, 9, 15]
def func(x):
    return x > 10

funcc = lambda x: x > 10
ress = filter(func, l)
for i in ress:
    print(i)

猜你喜欢

转载自blog.csdn.net/chengyinman0078/article/details/86763723
今日推荐