Python(^^^^^小技巧^^^^^——不定期更新)
偶然想到的小技巧
'''
交互中对传入函数的参数的数目进行检测
'''
def func(a,b,c):
print(a,b,c) s=input(">>>>:")
s=s.split()
t=tuple(s)
try: #Python本身会检测输入函数的参数数目是否对应,
func(*t) #*[元组]的方式传参数 #如果不对应,会报出TypeError,
except TypeError: # 所以可以捕获typeerror来方便的进行参数数目的检测
print("参数错误") #**kwargs 的方式传参也可以
#===================================================================>
# def func(x,y,*args): #args=(3,4,5,6)
# print(x,y)
# print(args)
#
# func(1,2,*(3,4,5,6)) #foo(1,2,3,4,5,6) #这样传参和解开元组后传参效果是一样的
#=====================================================================================>
# def func(x,y,**kwargs): #x=1,y=2,**kwargs=**{'a':1,'b':3,'z':3}
# print(x,y)
# print(kwargs)
#
# func(1,y=2,**{'a':1,'b':3,'z':3}) #func(1,y=2,z=3,b=3,a=1) #这样传参就和解开字典后传参,效果一样
#不加*、**,元组、字典就没有响应的功能,只能传给一个形参
#函数是第一类对象: 指的是函数可以被当做数据传递 # def func():
# print('from func') #可被引用
# f=func #可以当做函数的参数
# def func():
# print('from func')
# def foo(x):
# print(x)
# x() # foo(func) #可以当做函数的返回值
# def foo():
# print('from foo')
# def bar():
# return foo
# f=bar()
# print(f)
# print(foo)
# f() # x=0
# def f1():
# x=1
# def f2():
# # x=2
# print(x)
# return f2
# f=f1()
# print(f)
# f() #可以当做容器类型的元素
# def select():
# print('select function')
#
# func_dic={
# 'select':select,
# }
#
# print(func_dic['select'])
# func_dic['select']()
# #
# def select():
# print('select func')
#
# def delete():
# print('delete func')
#
# def change():
# print('change func')
#
# def add():
# print('add func')
#
#
# while 1:
# cmd=input('>>: ').strip()
# if not cmd:continue
# if cmd == 'select':
# select()
# elif cmd == 'delete':
# delete()
# elif cmd == 'change':
# change()
# elif cmd == 'add':
# add()
# else:
# print('无效的命令') def select(cmd_l):
filename=cmd_l[-1]
pattern=cmd_l[1] with open(filename,'r',encoding='utf-8') as f:
for line in f:
if pattern in line:
print(line) def delete():
print('delete func') def change():
print('change func') def add():
print('add func') def check():
print('check func') func_dic={
'select':select,
'delete':delete,
'change':change,
'add':add,
'check':check,
} while 1:
inp=input('>>: ').strip()
if not inp:continue #如果输入为空则继续 输入自带bool值,如果为空,bool值为FALSE,不空则为True。
cmd_l=inp.split()
# print(cmd_l)
cmd=cmd_l[0]
if cmd in func_dic:
func_dic[cmd](cmd_l)
else:
print('无效的命令')
函数是第一类对象
#有参装饰器,在一般装饰器之外添加针对装饰函数的参数,增加了新参数,所以再加包一层
def deco(auth_type='file'):
def auth(func):
def wrapper(*args,**kwargs):
if auth_type == 'file':
print('文件的认证方式')
elif auth_type == 'ldap':
print('ldap认证方式')
elif auth_type == 'mysql':
print('mysql认证方式')
else:
print('不知到的认证方式')
return wrapper
return auth @deco(auth_type='abc') #@auth #index=auth(index)
def index():
print('welecome to index') @deco(auth_type='ldap')
def home(name):
print('welecome %s to home page' %name) index() home('egon')
有参装饰器
#直接使用地址调用函数能够跳过装饰器
with open(r'D:\py\empty\c.txt','r',encoding='utf-8') as f:
print(sum([float(i.split()[1])*int(i.split()[2]) for i in f]))
f.seek(0) #光标初始化
print([item for line in f for item in line.split() if item.isdigit()])
f.seek(0) #光标初始化
列表解析是能够套多层for循环的
def init(func): #send必须传值到yield,所以需要先将生成器暂停到一个yield,相当于每次send之前先要初始化一次。如果send的时候不是yield暂停,会报错
def wrapper(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return g
return wrapper @init
def eater(name):
print('%s ready to eat' %name)
food_list=[]
while True:
food=yield food_list #send传入的值给了yield,赋值给了food,但是执行结束的时候,返回值是food_list,和yield本身传入的值没有关系。
food_list.append(food)
print('%s start to eat %s' %(name,food))
yield生成器


# sleep(secs) #------------------time.sleep() I/O阻塞,(类似于input)不占cpu
# 线程推迟指定的时间运行,单位为秒。
sleep(secs)
随机推荐
- Spring Framework 官方文档学习(二)之IoC容器与bean lifecycle
到目前为止,已经看了一百页.再次感慨下,如果想使用Spring,那可以看视频或者找例子,但如果想深入理解Spring,最好还是看官方文档. 原计划是把一些基本接口的功能.层次以及彼此的关系罗列一下.同 ...
- 第二百八十一节,MySQL数据库-SQL注入和pymysql模块防止SQL注入
MySQL数据库-SQL注入和pymysql模块防止SQL注入 SQL注入就是通过SQL语句绕开程序判断,获取到数据库的内容 下面以一个简单的程序登录SQL注入举例: 正常登录 1.数据库有一张会员表 ...
- 【noip模拟题】天神下凡(贪心)
vijos某次模拟赛原题... 处理出每个圆的一级祖先就行了... 其实没有那么麻烦,贪心即可出解. 我们将每个圆转换成线段后按左端点小右端点大的方法排序 然后维护一个栈: 对于每一个圆i 如果栈顶右 ...
- tinycore remaster方法
11.1. PrerequisitesYou need a Linux distribution with the required programs available:cpio, tar, gzi ...
- 【转】虚拟串口VSPM解决串口编程问题
通过串口调试软件 UartAssist.exe 和虚拟串口软件 VSPM,可以解决串口编程时没用硬件调试的问题,通过VSPM虚拟出串口设备,让程序发送信息到 VSPM 设备后通过 UartAssist ...
- 设置两个WdatePicker的开始时间小于结束时间,结束时间大于开始时间
contract_start_date_id为开始时间ID contract_end_date_id为结束时间ID $("#contract_start_date_id").bin ...
- 提高ASP.NET网站性能的方法
http://www.360doc.com/content/14/0705/18/7662927_392224856.shtml Asp.NET有许多秘密,当你了解了这些秘密后,可以使得你的ASP ...
- 自己制作一个链表用来存储列表信息,并查找当前id信息,找上一条信息,下一条信息(信息浏览的时候方便使用)
偶然看到某些网站在新闻详情中 ,往往是需要根据当前信息id获取到上一条信息和下一条信息的,而通常我们的做法是先获取当前信息,再获取上一条信息,再获取下一条信息,就需要发送三次查询才能够得到这些信息,一 ...
- iOS 判断某一日期是否在一日期区间
-(BOOL)date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate { if ([date comp ...
- C#中命名空间别名的使用
C#中使用命名空间来分割不同的层级,在不同的层级中可以使用相同的类声明和变量声明.在程序中使用不同命名空间的下的相同名称的类时:可以用一下这几种方法进行限定: 1.使用完全限定名 using Syst ...