1.迭代器

# ### 迭代器
"""能被next调用,并不断返回下一个值的对象"""
"""
特征:迭代器会生成惰性序列,它通过计算把值依次的返回,一边循环一边计算而不是一次性得到所有数据
优点:需要数据的时候,一次取一个,可以大大节省内存空间.而不是一股脑的把所有数据放进内存.
"""
# 1.可迭代对象
"""
如果一个数据类型其中的成员包含了__iter__方法,这个数据类型就是可迭代对象
dir 这个函数可以获取该数据类型的成员结构
"""
setvar = {1,2,"a","b"}
print(setvar)
for i in setvar:
print(i) res = dir(setvar)
print(res) # 2.迭代器
"""
for循环在迭代数据的时候,内部先转化成迭代器,然后通过next方法来进行调用,形成迭代效果 可迭代对象 -> 迭代器 从不可被直接调用 -> 可被直接调用的过程 变成迭代器:
(1) iter (2) __iter__()
遍历迭代器:
(1) next (2)__next__()
判断迭代器:
(1)该数据含有__iter__ 和 __next__ 两个方法,
就说该数据类型是迭代器
(2)from collections import Iterator,Iterable 如果是一个迭代器,一个是一个可迭代对象
如果是一个可迭代对象,不一定是迭代器.
"""
# 变成迭代器
res1 = iter(setvar)
print(res1) #iterator
res2 = setvar.__iter__()
print(res2) # 遍历迭代器
res = next(res2)
res = next(res2)
res = next(res2)
print(res) lst = dir(res2)
print(lst)
# 判断可迭代对象
print("__iter__" in dir(setvar))
# 判断迭代器 方法一
print("__iter__" in dir(res2) and "__next__" in dir(res2)) # 判断迭代器 方法二
# from 从哪里.. collections模块 import 引入 Iterator迭代器 Iterable可迭代对象
from collections import Iterator,Iterable
listvar = [1,2,3,4,5]
# listvar 是否是一个迭代器
res = isinstance(listvar,Iterator)
print(res) # False
# listvar 是否是一个可迭代对象
res = isinstance(listvar,Iterable)
print(res) # True # 判断range的可迭代属性
res = isinstance(range(10) , Iterator)
print(res)
res = isinstance(range(10) , Iterable)
print(res) # 遍历range对象
for i in range(10):
print(i)
# 能被next调用的,一定是一个迭代器
# next(range(10)) error # 变成迭代器
it = iter(range(10))
print(it)
# 判断类型:isinstance
print(isinstance(it,Iterator)) # 调用range转换的迭代器
"""如果在调用时,超出了原有的数据个数,直接越界报错.
next在调用数据的时,是单向不可逆的.(一条路走到黑,一次性)
"""
# 遍历方法一
res = next(it)
res = next(it)
res = next(it)
res = next(it)
res = next(it)
res = next(it)
res = next(it)
res = next(it)
res = next(it)
res = next(it)
# res = next(it) error 越界报错
print(res) print("<====>")
# 重置迭代器
it = iter(range(10))
# 遍历方法二,通过for和next 配合调用
for i in range(3):
res = next(it)
print(res) # 遍历方法三,也可以通过for 一次性遍历所有迭代器中数据
print("<====>")
for i in it:
print(i)
# next(it) error
"""
用法1:isinstance(要判断的数据,数据类型) 返回True或者返回False
用法2:isinstance(要判断的数据,(数据类型1,数据类型2,数据类型3.....) ) 如果有一个条件满足,就返回真
int float bool complex str list tuple dict set
"""
"""
lst = [1,2,3]
res = isinstance(lst,list)
res = isinstance(lst,tuple)
# 有一个数据类型满足条件,就返回真
res = isinstance(lst, (list,tuple,set,str) )
print(res)
"""

2.高阶函数

2.1 map函数

# ### 高阶函数:能够把函数当成参数传递的就是高阶函数
"""
map reduce sorted filter
"""
# map
"""
map(func,iterable)
功能:把iterable里面的数据,一个一个扔到func函数中进行处理,把处理的结果放到迭代器中,最终返回迭代器
参数:
(1)func :内置函数 或 自定义函数
(2)iterable: 可迭代对象 容器类型数据,range对象,迭代器
返回值:
迭代器
"""
# 例子1: ["1","2","3","4"] => [1,2,3,4]
lst = ["1","2","3","4"]
lst2 = []
for i in lst:
res = int(i)
# print(res,type(res))
lst2.append(res)
print(lst2) from collections import Iterator,Iterable
it = map(int,lst)
print( isinstance(it,Iterator) )
# (1)可使用next进行调用
res = next(it)
res = next(it)
res = next(it)
res = next(it)
print(res) # (2)可使用for进行调用
it = map(int,lst)
for i in it:
print(i) # (3) for 配合 next 进行调用迭代器
it = map(int,lst)
for i in range(2):
res = next(it)
print(res) # (4) 使用list瞬间强转成列表.
it = map(int,lst) # 重置迭代器
lst = list(it)
print(lst) # 例子2 [1,2,3,4] [3,6,9,12]
lst = [1,2,3,4]
lst2 = []
for i in lst:
res = i*3
lst2.append(res)
print(lst2) """
第一次把lst中的1拿出来,扔到func当中进行处理,返回3,放到迭代器中
第二次把lst中的2拿出来,扔到func当中进行处理,返回6,放到迭代器中
第三次把lst中的3拿出来,扔到func当中进行处理,返回9,放到迭代器中
第四次把lst中的4拿出来,扔到func当中进行处理,返回12,放到迭代器中
到此iterable中的数据已经没有,终止函数,返回迭代器.
"""
def func(n):
return n * 3
it = map(func,lst)
print(list(it)) # 例子3 {97:"a",98:"b",99:"c"} ["a","b","c"] => [97,98,99]
# dic = {"a":97,"b":98,"c":99}
dic = {97:"a",98:"b",99:"c"}
dic2 = {}
res = dic.items() print(res)
print(isinstance(res,Iterator)) # False
print(isinstance(res,Iterable)) # True
# 反转字典中的键值对
for k,v in res:
print(k,v)
dic2[v] = k
print(dic2) # 同过字典的键,获取值,插入到新列表中.
print("---------")
lst = ["a","b","c"]
lst2 = []
for i in lst:
res = dic2[i]
lst2.append(res)
print(lst2) # map自定义函数,需要一个参数,必须写一个返回值
def func(n):
dic = {97:"a",98:"b",99:"c"}
# 反转字典中的键值对
for k,v in dic.items():
print(k,v)
dic2[v] = k
print(dic2) #{'a': 97, 'b': 98, 'c': 99}
return dic2[n] it = map(func,["a","b","c"])
print(list(it))

2.2 reduce

# ### reduce
"""
reduce(func,iterable)
功能:计算
先从iterable拿出2个数据,放到func中进行计算,得到的结果和iterable中的第三个元素,
在扔到func中做计算,依次类推,最终返回计算结果
参数:(1)func 内置函数 或 自定义函数
(2)iterable 可迭代对象 (容器类型数据,range对象,迭代器)
返回值: 计算出来的最终结果
"""
# 方法一
# lst = [5,4,8,8] => 5488
lst = [5,4,8,8]
strvar = ''
for i in lst:
strvar += str(i)
print(strvar,type(strvar))
print(int(strvar))

# 方法二
"""
5 * 10 + 4 = 54
54 * 10 + 8 = 548
548 * 10 + 8 = 5488
"""
it = iter(lst)
res1 = next(it) # 5
res2 = next(it) # 4
res = res1 * 10 + res2
print(res)

for i in it:
res = res * 10 + i
print(res,type(res))

# 使用reduce 进行改写
print("<============>")
"""
首先把5和4扔到func当中 5* 10 + 4 = 54
然后把54和iterable中的8,这两个参数扔到func中,
54 * 10 + 8 = 548
然后把548和iterable中的最后一个8两个参数扔到func中,
548 * 10 + 8 = 5488
计算完毕返回6=5488 结束.
"""
from functools import reduce
lst = [5,4,8,8]
def func(x,y):
return x*10 + y
res = reduce(func,lst)
print(res,type(res))

# "789" => 789 在不使用int强转的前提下完成
"""
"789" => [7,8,9]
list("789") = > ['7','8','9']
list("789") = > [7,8,9]
map(int,"789") error 不让用int
"""
strvar = "789"
def func1(n):
dic = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}
return dic[n]

def func2(x,y):
return x*10 + y

it = map(func1,strvar)
# print(list(it))
# 开始计算
res = reduce(func2,it)
print(res,type(res))

# error
# res = reduce(func2,strvar)
# print(res)

2.3. sorted

# ### sorted 
"""
sorted(iterable,reverse=False,key=函数)
功能:
排序
参数:
iterable 可迭代对象 (容器类型数据 range对象 迭代器)
reverse 控制正序或者倒序 reverse=True 倒序
key:可自定义排序的规则
返回值:
排序后的结果
"""
# 默认从小到大排序
lst = [88,31,-90,0]
res = sorted(lst)
print(res)

# 从大到小排序
lst = [88,31,-90,0]
res = sorted(lst,reverse=True)
print(res)

# 按照绝对值排序(使用内置函数)
lst = [-99,-2,45,1]
res = sorted(lst,key=abs)
print(res) #[1, -2, 45, -99]
"""
1 => 1
-2 => 2
45 => 45
-99 => 99
"""
"""
abs 获取一个数的绝对值
print(abs(-80.34))
print(abs(90))
"""
# 按照余数排序(使用自定义函数)
def func(n):
return n % 10
lst = (19,24,91,36)
"""
91 % 10 => 1
24 % 10 => 4
36 % 10 => 6
19 % 10 => 9
"""
res = sorted(lst,key=func)
print(lst)
print(res)

# 如果排序字符串,按照ascii编码来排序.
strvar = "cba"
res = sorted(strvar)
print(res)
"""
sort 基于原有列表进行修改
sorted 会产生一个新列表,原来的数据不动.
其余的用法一模一样.
只不过sort只能用在列表中
sorted可以用在所有容器类型数据中.
"""

2.4.fliter
# ### filter
"""
filter(func,iterable)
功能:过滤
在自定义的函数中,如果
return True 代表保留该数据
return False 代表舍弃该数据
参数:
1.func 自定义函数
2.iterable 可迭代对象 (容器类型数据 range对象 迭代器)
返回值:
迭代器
"""
# 1.基本写法
listvar = [24,234,23,423,4,234,1,23,12,31,231,2,3]
for i in listvar:
if i % 2 == 0:
print(i)
else:
pass

# 2.filter写法
def func(n):
if n % 2 == 0:
# 保留该数据
return True
else:
# 舍弃该数据
return False
it = filter(func,listvar)
print(list(it))

# 3.优化版
func = lambda n : True if n % 2 == 0 else False
it = filter(lambda n : True if n % 2 == 0 else False,listvar)
print(list(it))

3.推导式

 3.1 列表推导式

#!/usr/bin/env python
#-*- coding:utf-8 -*-
# ### 推导式 : 可以实现一些简单的操作,重要是代码比较简洁
"""
通过一行循环判断,遍历出一系列数据的方式是推导式
语法: val for val in Iterable (把想要的值写在 for的左侧)
里面是一行循环判断!根据套在推导式外层的符号判断具体是什么类型的推导式 推导式种类:三种
列表推导式 : [val for val in Iterable]
集合推导式 : {val for val in Iterable}
字典推导式 : {a:b for a,b in iterable}
"""
# lst = [1,2,3,4,5,6,7,8,9,10]
lst = []
for i in range(1,10):
lst.append(i)
print(lst) # (1).普通列表推导式
lst = [i for i in range(1,10)]
print(lst) # [1,2,3,4] => 2,4,6,8
lst = [i*2 for i in range(1,10)]
print(lst) # (2) 带有判断条件的列表推导式
'''
推导式的后面跟着只能是单项分支,其他的是不行的
'''
# 基本写法
lst = [1,2,3,4,5,6,67,7,8,9]
lst2 = []
for i in lst:
if i % 2 == 1:
lst2.append(i)
print(lst2) # 推导式写法
lst = [i for i in lst if i % 2 == 1]
print(lst) # (3) 双循环的列表推导式
lst1 = ['麦秸唐',"曾曼","王铁男"]
lst2 = ["舒则会","郭一萌","廖萍萍"]
# "谁谁"
lst = []
for i in lst1:
for j in lst2:
strvar = i +"" +j
# print(strvar)
lst.append(strvar)
print(lst) lst = [i +"" +j for i in lst1 for j in lst2]
print(lst) # (4) 带有判断条件的双循环列表推导式
lst1 = ['麦秸唐',"曾曼","王铁男"]
lst2 = ["舒则会","郭一萌","廖萍萍"]
lst = []
for i in lst1:
for j in lst2:
if lst1.index(i) == lst2.index(j):
strvar = i + "" + j
lst.append(strvar) print(lst) lst = [i + "" + j for i in lst1 for j in lst2 if lst1.index(i) == lst2.index(j)]
print(lst)

3.2 集合推导式

# ### 集合推导式
"""
案例:
满足年龄在18到21,存款大于等于5000 小于等于5500的人,
开卡格式为:尊贵VIP卡老x(姓氏),否则开卡格式为:抠脚大汉卡老x(姓氏)
把开卡的种类统计出来
"""
listvar = [
{"name":"王家辉","age":18,"money":10000},
{"name":"王水机","age":19,"money":5100},
{"name":"王鹏","age":20,"money":4800},
{"name":"李站","age":21,"money":2000},
{"name":"李小龙","age":180,"money":20}
]
"""
可哈希数据:不可变数据
Number(int float complex bool) str tuple
不可哈希数据:可变数据
list set dict
如果是字典的键或者是集合的值,数据类型必须可哈希
"""

"""
三目运算符:
True if 条件表达式 else False
如果条件表达式成立,执行True
如果条件表达式不成立,执行False
"""

# 基本语法
setvar = set()
for i in listvar:
if 18<=i['age']<=21 and 5000 <= i['money'] <= 5500:
strvar = "尊贵VIP卡老" + i['name'][0]
else:
strvar = "抠脚大汉卡老" + i['name'][0]
setvar.add(strvar)
print(setvar)

# 集合推导式
# lst = [15 if i % 2 == 1 else 16 for i in range(3)]# 16 15 16 例子
"""
# 分解:
{
左手边:
"尊贵VIP卡老" + i['name'][0] if 18<=i['age']<=21 and 5000 <= i['money'] <= 5500 else "抠脚大汉卡老" + i['name'][0]
右手边:
for i in listvar
}
"""
setvar = {"尊贵VIP卡老" + i['name'][0] if 18<=i['age']<=21 and 5000 <= i['money'] <= 5500 else "抠脚大汉卡老" + i['name'][0] for i in listvar}
print(setvar)
3.3 字典推导式

# ### 字典推导式
"""
### (1)enumerate
enumerate(iterable,[start=0])
功能:枚举 ; 将索引号和iterable中的值,一个一个拿出来配对组成元组放入迭代器中
参数:
iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range)
start: 可以选择开始的索引号(默认从0开始索引)
返回值:迭代器
"""
from collections import Iterator,Iterable
listvar = ['罗淞峰',"李祥海","银燕","赖廷"]
it = enumerate(listvar)
# print(it)
# print(isinstance(it,Iterator))
# print(list(it))
"""
[里面可以是列表,元组,字符串]
(里面可以是列表,元组,字符串)
{里面是元组}
[('a',1),('b',"sdfsdfsdfsdfsd")]
(['a',1],('b',"sdfsdfsdfsdfsd"))
{('a',1),("b",909090909090909090900909)}
"""

# dict 强转迭代器变成字典
# {0: '罗淞峰', 1: '李祥海', 2: '银燕', 3: '赖廷'}
res = dict(it)
print(res)

# 字典推导式的写法变成字典
it = enumerate(listvar) # 重置迭代器
dic = {k:v for k,v in it} #k接受的是012..345 v接受的是列表中的值
print(dic)

it = enumerate(listvar,start= 10)
dic = {k:v for k,v in it}
print(dic)

### (2)zip
"""
zip(iterable, ... ...)
功能: 将多个iterable中的值,一个一个拿出来配对组成元组放入迭代器中
iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range)
返回: 迭代器

正常按照索引进行配对,放到元组中,如果找不到配对选项,直接舍弃.
"""
lst1 = ["吴波","帅乐","温素文"]
# lst2 = ["夜光花","吴耀橘","王照"]
lst2 = ["夜光花","吴耀橘","王照"]
lst3 = ["温红杰","刘璐","陈凤杰"]
it = zip(lst1,lst2,lst3)
print(it)
print(isinstance(it,Iterator))
print(list(it))
print("----------")
# dict强转迭代器变成字典
lst2 = ["夜光花","吴耀橘","王照"]
lst3 = ["温红杰","刘璐","陈凤杰"]
res = dict(zip(lst2,lst3))
print(res)

# 字典推导式
dic = {k:v for k,v in zip(lst2,lst3) }
print(dic)

4.生成器

4.1 生成器表达式

# ### 生成器表达式 generprint("<====>")ator
"""
#迭代器和生成器区别:
迭代器本身是系统内置的.重写不了.而生成器是用户自定义的,可以重写迭代逻辑
#元组推导式的返回值是一个生成器对象,简称生成器,生成器本质就是迭代器. #生成器可以用两种方式创建:
(1)生成器表达式 (里面是推导式,外面用圆括号)
(2)生成器函数 (用def定义,里面含有yield)
"""
from collections import Iterator
# 基本定义
gen = (i for i in range(10))
print(gen) # 返回的是生成器对象,简称生成器
print(isinstance(gen,Iterator)) # 1.使用next方法调用生成器
res = next(gen)
res = next(gen)
res = next(gen)
print(res) # 2.for 配合 next 进行调用
print("<====>")
for i in range(5):
res = next(gen)
print(res) # 3.用for循环遍历生成器
print("<====>")
for i in gen:
print(i) 4.2 生成器函数

# ### 生成器函数
"""
# yield 类似于 return
共同点在于:执行到这句话都会把值返回出去
不同点在于:yield每次返回时,会记住上次离开时执行的位置 , 下次在调用生成器 , 会从上次执行的位置往下走
而return直接终止函数,每次重头调用.
yield 6 和 yield(6) 2种写法都可以 yield 6 更像 return 6 的写法 推荐使用
"""

# 1.基本语法
def mygen():
print("one")
yield 1

print("two")
yield 2

print("three")
yield 3
"""
初始化生成器函数返回生成器对象,简称生成器
第一次,通过next调用,执行print("one") , 记录当前的状态,返回yield 1,程序添加阻塞,等待下一次调用
第二次,通过next调用,执行print("two") , 记录当前的状态,返回yield 2,程序添加阻塞,等待下一次调用
第三次,通过next调用,执行print("three") , 记录当前的状态,返回yield 3,程序添加阻塞,等待下一次调用

第四次,通过next调用,因为没有yield 返回值了,所以直接越界报错 ...
"""

# 初始化生成器函数 , 返回生成器对象 , 简称生成器
gen = mygen()
# 调用第一次
res = next(gen)
print(res)
# 调用第二次
res = next(gen)
print(res)
# 调用第三次
res = next(gen)
print(res)
'''
# 调用第四次 error
res = next(gen)
print(res)
'''

# 2.升级版生成器函数
def mygen():
for i in range(100):
yield "我的球衣号码是{:d}".format(i)

# 初始化生成器函数 ,返回生成器对象,简称生成器
gen = mygen()
for i in range(50):
res = next(gen)
print(res)
print('-------')
for i in range(30):
print(next(gen))
print('-------')
# 如果是极大数据量,通过for遍历等于执行死循环
for i in gen:
print(i)


# 3. send 使用 send只能给上一个yield发送数据
"""
### send
# next和send区别:
next 只能取值
send 不但能取值,还能发送值
# send注意点:
第一个 send 不能给 yield 传值 默认只能写None
最后一个yield 接受不到send的发送值
"""
def mygen():
print("start")
res1 = yield 1
print(res1,"<内头>")

res2 = yield 2
print(res2,"<内头>")

res3 = yield 3
print(res3,"<内头>")

print("end")

# 初始化生成器函数 返回生成器对象, 简称生成器
gen = mygen()
# 第一次无法给上一个yield发送数据,强制发送None,硬性的语法要求
res = gen.send(None)
print(res)
print('%%%%%%%%%%%%')
# # 第二次
res = gen.send(111)
print(res,"<外头>")
print('%%%%%%%%%%%%')
# # 第三次
res = gen.send(222)
print(res,"<外头>")
"""
# # 第四次 error StopIteration
res = gen.send(333)
print(res,"<外头>")
"""

"""
代码执行过程:
第一次调用时,没有遇到上一个yield,所以默认只能发送None,执行生成器函数
print("start") res1 = yield 1 记录当前代码执行的状态 把 1 返回给函数外的res变量接受,程序添加阻塞,等待下一次调用 ,执行到77行

第二次调用时,把111发送给 res1 = yield 1 , res1 = 111 接收到发送值,
代码从77往下执行 print(111) res2 = yield 2 把 2 返回给函数外的res变量接受 print(res)
程序添加阻塞,等待下一次调用 ,执行到80行

第三次调用时,把222发送给 res2 = yield 2 , res2 = 222 接收到发送值,
代码从80往下执行 print(222) res2 = yield 3 把 3 返回给函数外的res变量接受 print(res)
程序添加阻塞,等待下一次调用 ,执行到83行

第四次调用时,把333发送给 res3 = yield 3 , res3 = 333 接收到发送值,
代码从83往下执行 print(333) print("end") , 因为没有yield的返回值,直接越界报错.

解决生成器越界错误,可以使用try... except..方法解决.
"""

# yield from : 将一个可迭代对象变成一个迭代器返回
def mygen():
yield from [1,2,3]
gen = mygen()
res = next(gen)
print(res)
res = next(gen)
print(res)
res = next(gen)
print(res)

print("<===>")
# 斐波那契数列 (用前两数相加得到第三个) (面试题)
# 1 1 2 3 5 8 13 21 34 .. 要第n个数是多少?
def mygen(n):
a,b = 0,1
i = 0
while i < n:
yield b
# print(b)
a,b=b,a+b
i+=1
gen = mygen(5)
for i in gen:
print(i)

5.内置函数

# ### 内置函数
# abs 绝对值函数
res = abs(-90)
res = abs(-99.7)
print(res) # round 四舍五入(n.5 n为偶数则舍去 n.5 n为奇数,则进一!) 奇进偶不进
res = round(3.67)
res = round(3.899999999999999999999999999999999999999999)
res = round(6.5)
res = round(8.5)
res = round(7.5)
res = round(8.51)
print(res) # sum 计算一个序列得和
tup = (1,34,34,23,42,34,2,342,43,2,34)
print(sum(tup)) # max 获取一个序列里边的最大值
lst = [2,4,23,423,42,43,23,4,234,2,34,234,999]
print(max(lst))
lst2 = sorted(lst)
print(lst2) # 最大值
print(lst2[-1])
# 最小值
print(lst2[0]) # min 获取一个序列里边的最小值 key = 自定义函数
lst = [2,4,23,423,42,43,23,4,234,2,34,234,999]
res = min(lst)
print(res) print("<=====>")
"""
('罗送风', 80)
('银燕', 81)
('舒则会', 18)
('郭一萌', 90)
"""
lst = [("罗送风",82),("银燕",81),("舒则会",18),("郭一萌",90)]
def func(n):
# print(n)
return n[1] % 10
"""
0 ("郭一萌",90)
1 ("银燕",81)
2 ("罗送风",82)
8 ("舒则会",18)
"""
res = min(lst,key=func)
print(res) # pow 计算某个数值的x次方
"""第三个参数是可选项,如果存在,那么前两个数平方之后再和第三个数取余."""
res = pow(2,3)
print(res)
res = pow(2,3,3) # 2
res = pow(2,3,4) # 0
res = pow(2,3,5) # 3
print(res) # range 产生指定范围数据的可迭代对象
for i in range(5):
print(i)
for i in range(3,7):
print(i)
for i in range(9,0,-2):
print(i) # bin 将10进制数据转化为二进制
print(bin(6))
# oct 将10进制数据转化为八进制
print(oct(9))
# hex 将10进制数据转化为16进制
print(hex(16)) # chr 将ASCII编码转换为字符
print(chr(97))
# ord 将字符转换为ASCII编码
print(ord("A")) # eval 将字符串当作python代码执行
strvar = "print(1234)"
# print(strvar)
res = eval(strvar)
print(res) # eval返回值没有意义,直接执行即可 strvar = 'wangwen = "宇宙最帅的人啊"'
# eval(strvar) error eval 执行部分字符串时,比如声明变量,是不允许的 # exec 将字符串当作python代码执行(功能更强大)
strvar = 'wangwen = "宇宙最帅的人啊"'
exec(strvar)
print(wangwen) strvar = """
for i in range(10):
print(i)
"""
exec(strvar) # repr 不转义字符输出字符串 (原型化输出)
strvar = "老男孩老师来到深圳校区视察工作\n每个员工表现的非常积极"
res = repr(strvar)
print(res) # input 接受输入字符串,程序会添加阻塞
res = input("先森,你妈贵姓?")
print(res) # hash 生成哈希值
strvar1 = "保定爱迪生,狄龙,专门早无用发明"
strvar2 = "保定爱迪生,狄龙,专门早无用发明"
print(hash(strvar1))
print(hash(strvar2))

6.模块

6.1 math数学模块
# ### math 数学模块        使用:模块.方法()
import math
#ceil() 向上取整操作 (对比内置round)
res = math.ceil(3.01)
res = math.ceil(3.000000000000000000000000000000001)
res = math.ceil(3.999)
print(res)

#floor() 向下取整操作 (对比内置round)
res = math.floor(3.98)
res = math.floor(3.1111)
print(res)

#pow() 计算一个数值的N次方(结果为浮点数) (对比内置pow)
res = math.pow(2,3)
print(res)
# res = math.pow(2,3,3) error 没有第三个参数
# print(res)

#sqrt() 开平方运算(结果浮点数)
res = math.sqrt(9)
print(res)

#fabs() 计算一个数值的绝对值 (结果浮点数) (对比内置abs)
res = math.fabs(-8)
print(res)

#modf() 将一个数值拆分为整数和小数两部分组成元组
res = math.modf(5.12)
print(res) # (0.1200000000000001, 5.0)

#copysign() 将参数第二个数值的正负号拷贝给第一个
res = math.copysign(5,-9)
res = math.copysign(-5,-9)
print(res)
#fsum() 将一个容器数据中的数据进行求和运算 (结果浮点数)(对比内置sum)
lst = [1,3,43,4,34]
res = math.fsum(lst)
print(res)

#圆周率常数 pi
res = math.pi
print(res)

6.2 time时间模块

# ### time 时间模块
import time

#time() 获取本地时间戳
res = time.time()
print(res)

#mktime() 通过[时间元组]获取[时间戳] (参数是时间元组)
# 年月日,时分秒,周几, 年中第几天 ,夏令时
ttp = (2019,7,21,18,28,0,0,0,0)
res = time.mktime(ttp)
print(res)

#localtime() 通过[时间戳]获取[时间元组] (默认当前时间)
# 用法1
res = time.localtime() #time.struct_time(tm_year=2019, tm_mon=7, tm_mday=21, tm_hour=18, tm_min=30, tm_sec=44, tm_wday=6, tm_yday=202, tm_isdst=0)
print(res)
# 用法2 可以具体指定时间戳
res = time.localtime(1563704880)
print(res)
# time.struct_time(tm_year=2019, tm_mon=7, tm_mday=21, tm_hour=18, tm_min=28, tm_sec=0, tm_wday=6, tm_yday=202, tm_isdst=0)

#ctime() 通过[时间戳]获取[时间字符串] (默认当前时间)
res = time.ctime()
print(res) # Sun Jul 21 18:32:46 2019

res = time.ctime(1563704880)
print(res)

#asctime() 通过[时间元组]获取[时间字符串](参数是时间元组)
'''asctime不能够自动识别周几,需要手动填写'''
ttp = (2019,7,21,18,28,0,6,0,0)
res = time.asctime(ttp)
print(res)

# 解决方式:用mktime和ctime配合解决
ttp = (2019,7,21,18,28,0,0,0,0)
res = time.mktime(ttp)
strtime = time.ctime(res)
print(strtime)

#strftime() 通过[时间元组]格式化[时间字符串] (格式化字符串,[可选时间元组参数])
# 年月日,时分秒 linux 使用中文不会报错,windows会报错
res = time.strftime("%Y-%m-%d %H:%M:%S")
print(res)
# 加上第二个参数,按照实际的时间元组转成时间字符串,如果不加,以当前默认时间进行转化.
ttp = (2019,7,21,18,28,0,0,0,0)
res = time.strftime("%Y-%m-%d %H:%M:%S",ttp)
print(res)

#strptime() 通过[时间字符串]提取出[时间元组] (时间字符串,格式化字符串)
"""两个字符串之间,除了格式化标签,其他必须一模一样"""
strvar1 = "2019年8月1号5点10分20秒是建军节"
strvar2 = "%Y年%m月%d号%H点%M分%S秒是建军节"
res = time.strptime(strvar1,strvar2)
print(res)
# time.struct_time(tm_year=2019, tm_mon=8, tm_mday=1, tm_hour=5, tm_min=10, tm_sec=20, tm_wday=3, tm_yday=213, tm_isdst=-1)

#sleep() 程序睡眠等待
# time.sleep(3)
# print("睡醒了")

#perf_counter() 用于计算程序运行的时间
starttime = time.perf_counter()

for i in range(1000000000):
pass

endtime = time.perf_counter()
res = endtime - starttime
print(res)

Learn day5 迭代器\生成器\高阶函数\推导式\内置函数\模块(math.time)的更多相关文章

  1. 12.Python略有小成(生成器,推导式,内置函数,闭包)

    Python(生成器,推导式,内置函数,闭包) 一.生成器初始 生成器的本质就是迭代器,python社区中认为生成器与迭代器是一种 生成器与迭代器的唯一区别,生成器是我们自己用python代码构建成的 ...

  2. Python函数04/生成器/推导式/内置函数

    Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...

  3. 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ

    一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...

  4. 生成器的send方法、递推函数、匿名函数及常用内置函数

    生成器的send方法 在使用yield方法创建生成器时,不仅可以使用next方法进行取值,还可以通过send方法向生成器的内部传值 什么是send方法? send方法相当于高级的next方法,send ...

  5. python 函数 装饰器 内置函数

    函数 装饰器 内置函数 一.命名空间和作用域 二.装饰器 1.无参数 2.函数有参数 3.函数动态参数 4.装饰器参数 三.内置函数 salaries={ 'egon':3000, 'alex':10 ...

  6. python之路(4)高阶函数和python内置函数

    前言 函数式编程不用变量保存状态,不改变变量 内置函数 高阶函数 把函数当作参数传给另一个对象 返回值中包含函数 使用的场景演示: num_test = [1,2,10,5,8,7] 客户说 :对上述 ...

  7. Python之旅Day3 文件操作 函数(递归|匿名|嵌套|高阶)函数式编程 内置方法

    知识回顾 常见五大数据类型分类小结:数字.字符串.列表.元组.字典 按存值个数区分:容器类型(列表.字典.元组) 标量原子(数字.字符串) 按是否可变区分:可变(列表.字典) 不可变(数字.字符串.元 ...

  8. python函数知识六 内置函数二、匿名函数与内置函数三(重要)

    19.内置函数二 abs():绝对值 lst = [1,2,-3,1,2,-5] print([abs(i) for i in lst]) enumerate("可迭代对象",&q ...

  9. Python学习(七)——匿名函数、map函数、filter函数、reduce函数与其他内置函数

    匿名函数 lambda x: x + 1 # lambda:定义匿名函数的关键字 # x:形参 # x+1:程序处理逻辑 fun = lambda x: x + 1 print(fun(5)) #6 ...

随机推荐

  1. Python-列表推导式、生成器、字典推导式

    列表推导式 [] + for + if 算子.循环.条件, 对相同的数据进行处理, 算子也可以是函数 number = [i for i in range(1, 101) if i % 2 == 0] ...

  2. OpenCV图像处理学习笔记-Day03

    OpenCV图像处理学习笔记-Day03 目录 OpenCV图像处理学习笔记-Day03 第31课:Canny边缘检测原理 第32课:Canny函数及使用 第33课:图像金字塔-理论基础 第34课:p ...

  3. .NET 是信息技术应用创新产业重要参与者

    今天是国庆节,也是中秋节,月满中秋,举国欢庆,在这里祝各位开发者中秋国庆快乐. 放假在家就想把这几年对于.NET发展相关生态做个梳理,写一篇文章来总结一下这两年从腾讯出来自己创业,推动.NET在国内的 ...

  4. 【题解】[SHOI2007]善意的投票 / [JLOI2010]冠军调查

    Link \(\text{Solution:}\) 我们令源点和汇点分别为睡觉和不睡觉这两种互斥的决策点.把小朋友看成点,问题转化为最小割. 每一个小朋友对自己的意愿指向的汇点/源点.容量为\(1.\ ...

  5. 【题解】SP1812 【LCS2 - Longest Common Substring II 】

    \(\text{Suffix Tree:}\)我来啦我来啦 \(\text{Solution:}\) 题目要求求好几个串串的\(\text{LCS.}\) 由于串串的数量并不多,所以我们把它们塞到一个 ...

  6. JavaScript返回当前的时分秒

    要求: 封装一个函数返回当前的时分秒 格式 08:08:08 代码实现: function getTimer() { var time = new Date(); var h = time.getHo ...

  7. Java 将Html转为PDF(二)

    前面介绍了如何通过插件的方式将Html文件转为PDF,该方法需要使用Spire.PDF for Java 3.6.6或者之后的新版本,可根据自己的系统选择不同插件来实现转换.本文提供另外一种转换方法, ...

  8. TTL电平,CMOS电平,232/485电平,OC门,OD门基础知识

     1.RS232电平 或者说串口电平,有的甚至说计算机电平,所有的这些说法,指得都是计算机9针串口 (RS232)的电平,采用负逻辑, -15v ~ -3v 代表1 +3v ~ +15v 代表0 2. ...

  9. org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, "enterpCd")-Mybatis报错

    一.问题由来 下午快要下班时,登录测试服务器查看日志信息,看看有没有新的异常信息,如果有的话好及时修改.结果一看果然有新的异常信息. 主要的异常信息如下: 2020-10-13 14:51:03,03 ...

  10. 机器分配----线性dp难题(对于我来说)

    题目: 总公司拥有高效设备M台, 准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M <= 15, ...