函数相关的
# 生成器相关的
# 例1 ll = sum(i for i in range(100000000)) #生成器占资源少 # 例2 def demo(): for i in range(4): yield i g = demo() g1 = (i for i in g) g2 = (i for i in g1) print(list(g1)) #取值1次结束 print(list(g2)) # 例3 def add(n,i): return n+i def test(): for i in range(4): #0 1 2 3 yield i g = test() for n in [1,10]: g = (add(n,i) for i in g) #解析思路 # n=10 # g2 = (add(10,i) for i in ((add(10,i) for i in g))) #10 11 12 13 print(list(g))
# compile 将字符串类型的代码编译。代码对象能够通过exec语句来执行或者eval()进行求值
eval() 将字符串类型的代码执行并返回结果 print(eval('1+2+3+4')) exec()将自字符串类型的代码执行 exec("1+2+3+4") #没有返回值 exec("print('hello,world')")
def print(self, *args, sep=' ', end=' ', file=None): # known special case of print """ print(value, ..., sep=' ', end=' ', file=sys.stdout, flush=False) file: 默认是输出到屏幕,如果设置为文件句柄,输出到文件 sep: 打印多个值之间的分隔符,默认为空格 end: 每一次打印的结尾,默认为换行符 flush: 立即把内容输出到流文件,不作缓存 """
f = open('tmp_file','w') print(123,456,sep=',',file = f,flush=True) #输出到文件里面
import time #打印一个进度条
for i in range(0,101,2):
time.sleep(0.1)
char_num = i//2 #打印多少个'*'
per_str = ' %s%% : %s ' % (i, '*' * char_num) if i == 100 else ' %s%% : %s'%(i,'*'*char_num)
print(per_str,end='', flush=True)
t = (1,2,3) #hash(o) o是参数,返回一个可hash变量的哈希值,不可hash的变量被hash之后会报错。 l = [1,2,3] print(hash(t)) #可hash 2528502973977326415 print(hash(l)) #会报错 TypeError: unhashable type: 'list' callable(o),o是参数/函数名,看这个变量是不是可调用。 #和调用相关的 dir() 默认查看全局空间内的属性,也接受一个参数,查看这个参数内的方法或变量 #查看参数所属类型的所有内置方法 序列——列表和元组相关的:list和tuple 序列——字符串相关的:str,format,bytes,bytearry,memoryview,ord,chr,ascii,repr 序列:reversed,slice l = (1,2,23,213,5612,342,43) print(l) print(list(reversed(l))) l = (1,2,23,213,5612,342,43) sli = slice(1,5,2) print(l[sli])
# 匿名函数lambda
t1 = (('a'),('b')) t2 = (('c'),('d')) # 下面3种方法 dic = [{i:j} for i,j in (zip(t1,t2))] #直接打印就行 test = lambda t1,t2:[{i:j} for i,j in zip(t1,t2)] #函数 打印取值时候要调用 test = list(map(lambda t:{t[0]:t[1]},zip(t1,t2))) #直接取值赋值变量test
def multipliers(): return [lambda x:i*x for i in range(4)] #改进的地方 是这里 []变小括号 print(list(m(2) for m in multipliers())) # 下面是一个简单的分析 lst = [] def funcs(): for i in range(4): def func(x): return i*x lst.append(func) return lst print(list(k(2) for k in funcs()))
#测试递归 998 官方1000 定义:在一个函数里面调用自己本身 def foo(n): print(n) n += 1 foo(n) foo(1)
import sys #修改递归最大深度 print(sys.setrecursionlimit(100000))
menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': { '爱奇艺': {}, '汽车之家': {}, 'youku': {}, }, '上地': { '百度': {}, }, }, '昌平': { '沙河': { '老男孩': {}, '北航': {}, }, '天通苑': {}, '回龙观': {}, }, '朝阳': {}, '东城': {}, }, '上海': { '闵行': { "人民广场": { '炸鸡店': {} } }, '闸北': { '火车战': { '携程': {} } }, '浦东': {}, }, '山东': {}, } # def threeLM(dic): # while True: # for k in dic: # print(k) # key = input('input>>').strip() # if key == 'b' or key == 'q': # return key # elif key in dic.keys() and dic[key]: # ret = threeLM(dic[key]) # if ret == 'q': # return 'q' # threeLM(menu)
下面是堆栈的实现 # l = [menu] # while l: # for key in l[-1]:print(key) # k = input('input>>').strip() # 北京 # if k in l[-1].keys() and l[-1][k]:l.append(l[-1][k]) # elif k == 'b':l.pop() # elif k == 'q':break
各种序列的解压 a,*_=(1,2,3,4) #a=1 *_,d=(1,2,3,4) #d=4 a,b,c = (1,2,3) a,b,c = [1,2,3] a,b,c = {1,2,3} a,_b= {'name':'Ray','age':11} #a=name b=age
参数陷阱:默认参数是一个可变数据类型 def func(x,lst=[]): 列表 lst.append(x) print(lst) func('Ken') #['Ken'] func('Ray') #['Ken', 'Ray'] def func(x,dic={}): 字典 dic.update(x) print(dic) func({'k':'v'}) #{'k': 'v'} func({'x':'m'}) #{'k': 'v', 'x': 'm'} def func(x,dic={1}): 集合 dic.add(x) print(dic) func(2) #{1,2} func(3) #{1,2,3}
*args 按位置传参,接收多余的参数,保存成元组形式 **kwargs 按关键字传参,接收多余的,保存成字典形式 def 函数名(参数1,参数2,*args,默认参数,**kwargs): """注释:函数功能和参数说明""" 函数体 …… return 返回值