Python基础-day15-内置函数

======================================

======================================

======================================

======================================

======================================

 

 ======================================

======================================

======================================

======================================

======================================

======================================

======================================

hash(dict) # 错误,字典不可哈希,字典为可变数据类型

hash(set) # 错误,集合不可哈希,集合为可变数据类型

hash(list) # 报错,列表不可哈希,列表为可变数据类型

 

hash(str) # 正确,字符串可哈希,字符串为不可变数据类型

hash(int) # 正确,整数可哈希,整数为不可变数据类型

hash(tuple) # 正确,元祖可哈希,元祖为不可变数据类型

hash(bool)   # 正确,布尔可哈希,布尔为不可变数据类型

======================================

默认的打印方式:

print(1, 2)

打印结果:

D:\tutorial\venv\Scripts\python.exe D:/tutorial/test1.py

1 2

 

Process finished with exit code 0

 

print(1, 2, sep='......', end='++++++')

打印结果:

D:\tutorial\venv\Scripts\python.exe D:/tutorial/test1.py

1......2++++++

Process finished with exit code 0

 

如果要打印到文件中,需要打开一个文件,获取文件标识符,然后将标识符传给print函数。

print(1, 2, file=f)

此时内容就输入到了文件中。

 

print(1, 2, flush=True)

因为print打印的内容会存放在内存中,某些时刻不会立即显示到屏幕或文件中,设置flush=True让内存中的内容立即刷新到屏幕和文件中。

经测试,无效,文件中根本没有实时刷新,程序结束才刷新】

======================================

进度条

import time
import sys


for i in range(1, 101):
    progress = '-' * i + '>'
    sys.stdout.write('\r' + (progress + ' ' + str(i) + '%'))
    time.sleep(1)
    sys.stdout.flush()

======================================

 

def func(par):
    print(par)
    return par


ret = eval("func(a)", {"a": 1, "func": func})
print(ret)

打印:

1

1

 

def func(par):
    print(par)
    return par


ret = exec("func(a)", {"a": 1, "func": func})
print(ret)

打印:

1

None(因为exec没有返回值)

 

def func(par):
    print(par)
    return par


code_string = "func(1)"
code = compile(code_string, 'test.log', 'eval')  # test.log用于存放错误日志信息
ret = eval(code)
print(ret)

打印:

1

1

 

def func(par):
    print(par)
    return par


code_string = "func(1)"
code = compile(code_string, 'test.log', 'exec')
ret = exec(code)
print(ret)

打印:

1

None

 

code_string = "name = input('请输入你的名字: ')"
code = compile(code_string, 'test.log', 'single')  # 如果是交互式地字符串语句,需要以single模式编译
eval(code)

exec(code)
print(name)

 

 ======================================

======================================

======================================

======================================

print(round(3.14159, 2))
print(round(3.14159, 3))
print(round(4.14159, 4))

3.14

3.142

4.1416

print(sum([1, 2, 3], 10))
print(sum((1, 2, 3), 10))
print(sum({1, 2, 3}, 10))

16

16

16

print(min(1, 2, 3))
print(min(1, 2, 3, -1))
print(min(1, 2, 3, -1, key=abs))  # 最后的key可以指定其他排序算法,abs代表绝对值

print(min([1, 2, 3]))

li = []
print(min(li, default=0)) # 当可迭代对象li为空时,返回默认值0

# min接收两种参数,一种是可迭代参数,另一种就是2个或多个数。
print(max(1, 2, 3))
print(max(1, 2, 3, -1))
print(max(1, 2, 3, -1, key=abs))

print(max([1, 2, 3]))

li = []
print(max(li, default=0))

 

======================================

======================================

这个地方稍微注意一下,一个是li.reverse(),一个是reversed(li)。

 

li = [1, 2, 3, 4, 5]
li.reverse()
print(li)

li2 = [6, 7, 8, 9, 10]
li3 = reversed(li2)
print(li3)

[5, 4, 3, 2, 1]

<list_reverseiterator object at 0x03840930>

======================================

======================================

 

print(format('test'))
print(format('test', '>20'))
print(format('test111', '>20'))
print(format('test111111', '>20'))

在个format在显示字符串的时候,做格式化操作比较方便,对齐显示。

 

======================================

 

print(bytes('你好', encoding='GBK'))
print(bytes('你好', encoding='utf-8'))
print(bytes('你好', encoding='GBK').decode('GBK'))

 

在网络传输中,就需要经常将字符串数据按照指定编码方式转换成对应的bytes数据类型,然后通过网络发送给其他位置。

所以要经常使用encodedecode

 

b_array = bytearray('你好', encoding='utf-8')
print(b_array)
print(b_array[0])
print(b_array[1])

print(hex(228))
print(hex(189))

bytearray(b'\xe4\xbd\xa0\xe5\xa5\xbd')

228

189

0xe4

0xbd

说明在字节列表中,分别保存了十六进制的十进制数据,比如十六进制0xe4对应的十进制为228十六进制0xbd对应的十进制为189

所谓字节列表,好比将4个字节或6个字节放在字节列表中。

======================================

字符转unicode码

unicode码转字符

 

切记:只能转单个字符,不要转字符串。

在使用chr()时,里面的数字范围为:0 到 0x10ffff

======================================

======================================

print(all([1, 2, 3]))
print(all([1, '', 0]))
print(all([[], 1, 2]))
print(all([]))

True

False

False

True

print(any([1, 2, 3]))
print(any([1, '', 0]))
print(any([[], 1, 2]))
print(any([]))

True

True

True

False

======================================

l1 = [1, 2, 3, 8, 9]
l2 = [4, 5, 6, 7]
zip_object = zip(l1, l2)
print(zip_object, type(zip_object))
print(hasattr(zip_object, '__iter__'))
print(hasattr(zip_object, '__next__'))

# print(zip_object.__next__())
# print(zip_object.__next__())
# print(zip_object.__next__())
# print(zip_object.__next__())

for i in zip_object:
    print(i)

<zip object at 0x037053F0> <class 'zip'>

True

True

(1, 4)

(2, 5)

(3, 6)

(8, 7)

 

dic1 = {'name': 'yang', 'age': 20}
dic2 = {'name': 'wang', 'age': 20}

zip_obj = zip(dic1, dic2)

for i in zip_obj:
    print(i)

('name', 'name')

('age', 'age')

只是key跟key进行连接。

 

l1 = [1, 2, 3]
l2 = [4, 5, 6]
l3 = [7, 8, 9]
zip_object = zip(l1, l2, l3)
print(zip_object, type(zip_object))
print(hasattr(zip_object, '__iter__'))
print(hasattr(zip_object, '__next__'))

for i in zip_object:
    print(i)

<zip object at 0x02C75418> <class 'zip'>

True

True

(1, 4, 7)

(2, 5, 8)

(3, 6, 9)

 

======================================

 

在生成器表达式中,if条件在后面,只有满足条件地数据才会记录到生成器对象中。

而这里的filter中,if的角色被过滤器中的漏斗替代了,所谓的漏斗就是一个函数,它来分辨牛鬼蛇神。是人,就保留,是鬼,就丢弃。

======================================

 

这个跟前面的filter有所不同,filter是将满足条件的数据保留下来,而map是将计算出来的结果保留下来。

def count_num(x):
    return len(x)


ret = map(count_num, [(1, 2, 3), (4, 5), (6, 7)])

for i in ret:
    print(i)

3

2

2

 

map的参数:第一个是函数,第二个是可迭代对象。

======================================

li1 = [1, -4, 6, 5, -10]

li2 = sorted(li1)
# 第一个参数 可迭代对象
# 第二个参数 排序方式(函数)
# 第三个参数 反向
print(li1)
print(li2)

打印:

[1, -4, 6, 5, -10]

[-10, -4, 1, 5, 6]  # sorted默认按数值的大小进行排序

 

li1 = [1, -4, 6, 5, -10]

li2 = sorted(li1, key=abs)

print("排序前: ", li1)
print("排序后: ", li2)

打印:

排序前: [1, -4, 6, 5, -10]

排序后: [1, -4, 5, 6, -10]

先将所有数据用abs处理后,用它们的结果进行排序,但实际返回的是它们的本尊

 

li1 = [1, -4, 6, 5, -10]

li2 = sorted(li1, key=abs, reverse=True)

print("排序前: ", li1)
print("排序后: ", li2)

打印:

排序前: [1, -4, 6, 5, -10]

排序后: [-10, 6, 5, -4, 1]

添加reverse参数后,就进行反向排序

 

======================================

注意,上图中有一个错误,我写错了。如果有多个参数,就用逗号分开,而不是多个函数用逗号分开。

lambda arg1arg2, ....., argn:expression

这就是匿名函数最全的表达式。

匿名函数不需要return来返回值,表达式本身结果就是返回值。

 

lambda返回的值,结合map,filter,reduce使用:

li = map(lambda n: n * n, [1, 2, 3, 4])

for i in li:
    print(i)

打印:

1

4

9

16

 

filter(lambda x:x%3==0,[1,2,3,4,5,6])
[3, 6]

 

无参匿名函数:

t = lambda : True # 分号前无任何参数
print(t())

# 等价于

def func():
    return True

打印:

True

 

s = "this is\na\ttest"     # 建此字符串按照正常情形输出
print(s)
# 打印
'this is\na\ttest'
print(s.split())           # split函数默认分割:空格,换行符,TAB
#打印
['this', 'is', 'a', 'test']
print(' '.join(s.split())) # 用join函数转一个列表为字符串
'this is a test'

等价于

(lambda s:' '.join(s.split()))("this is\na\ttest")

首先前面的lambda s:' '.join(s.split())是一个函数对象,它作为一个整体,其实表示的就是一个内存地址

在内存地址后添加()就是调用这个函数。在()中添加参数就是传递参数给左边的函数对象。

匿名函数接收到参数后,就开始计算。

 

带参数的匿名函数:

lambda x: x**3      # 一个参数
lambda x,y,z: x+y+z # 多个参数
lambda x,y=3: x*y   # 允许参数存在默认值

 

a = lambda *z: z             # *z返回的是一个元祖
a('Testing1','Testing2')
('Testing1', 'Testing2')

注意:之类的*z好比*args,z相当于是一个空元祖,所有的位置参数会被放置到该元祖中。

故最后的z就是我们传递进去的2个参数。

 

c = lambda **arg: arg  # arg返回的是一个字典
c()
{}

同理,**arg相当于是**kwargs。kwargs是一个空字典,所有的关键字参数会被放置到该字典中。

 

lambda本身作为返回值被返回

def increment(n):
    return lambda x: x+n

f = increment(4)
f(2)
# 打印
6

 

和列表结合,和字典结合,和Tkinter结合,和map结合

有了基础,就能建高楼大厦,成不成,试一下即可。

 

lambda和sorted联合使用

# 按death名单里面,按年龄来排序
# 匿名函数的值返回给key,进行排序

death = [('James', 32), ('Alies', 20), ('Wendy', 25)]

sorted(death, key=lambda age: age[1])     # 按照第二个元素,索引为1排序
[('Alies', 20), ('Wendy', 25), ('James', 32)]

首先看key,它的作用是决定按照什么来排序。看匿名函数的逻辑,它是获取年龄。

最终获取的是32, 20, 25,然后进行排序,20, 25, 32,最终的结果就是上面的结果。

 

a = [1,2,3,4]
b = [5,6,7,8]
map(lambda x,y:x+y, a,b)   # 在a, b序列中各取一个值,然后进行计算,如果有多个序列,以最短的那个为准
[6, 8, 10, 12]

 

======================================

python2 中是reduce

python3 中是functools.reduce

from functools import reduce


print(reduce(lambda x, y: x + y, [1, 2, 3, 4]))

# 打印10

print(reduce(lambda x, y: x + y, [1, 2, 3, 4], 20))

# 打印30

print(reduce(lambda x, y: x + y, [], 20))

# 打印20(特别注意,如果序列为空,必须要传初始值,否则报错)

reduce的函数全称是:

reduce(function, sequence, initial)

最后的inital可传可不传。

reduce的作用就是计算sequence中的所有值的和。从前往后取,每次取两个值,直到所有值都被加起来。

 

======================================

======================================

======================================

import sys
sys.setrecursionlimit(1500)  # 修改递归调用深度


def recursion(n):   # 定义递归函数
    print(n)        # 打印n
    recursion(n+1)  # 在函数的运行种调用递归


recursion(1)        # 调用函数

# n = 1
print(1)
recursion(2)

# n = 2
print(2)
recursion(3)

# n = 3
print(3)
recursion(4)

# ...

修改递归调用深度:

import sys
sys.setrecursionlimit(1500)  # 修改递归调用深度

 

======================================

======================================

posted @ 2019-11-02 16:28  道霖  阅读(190)  评论(0)    收藏  举报