函数式编程的优点:
可扩展性、可复用性(不修改以前代码)、可阅读性(初学者通俗易懂)
__init__:作为python包文件使用,否则只是个文件夹
__name__:文件内部调用时__name__==' __main__';外部调用时,__name__==文件名
__file__:当前文件路径
1、默认参数使用
>>> def person(name,action='eat...',where='beijing'): ... print name,action,'in '+where ... >>> person('cxiong') cxiong eat... in beijing >>> person('xmzhang','sleep') xmzhang sleep in beijing >>> person('cxiong',where='shanghai',action='work') cxiong work in shanghai >>> person('cxiong','work','wuhan') cxiong work in wuhan
2、可变参数*arg包装为列表传入函数
>>> def show(*arg): ... for item in arg: ... print item ... >>> show('cxiong','xmzhang') cxiong xmzhang >>>
3、可变参数**kargs包装为字典传入函数
>>> def person(**kargs): ... for item in kargs.items(): ... print item ... >>> person(name='cxiong',age=29) ('age', 29) ('name', 'cxiong') >>> person(name='xmzhang',age=29) ('age', 29) ('name', 'xmzhang')
将字典传输时,需要使用**kargs变量;
>>> user_dict={'cxiong':29,'xmzhang':29} >>> person(**user_dict) ('cxiong', 29) ('xmzhang', 29) >>> person(user_dict) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: person() takes exactly 0 arguments (1 given) >>>
4、yield用法
xrange迭代调用时才创建对象,延时创建对象;
>>> for i in xrange(10): ... print i ... 0 1 2 3 4 5 6 7 8 9 >>>
>>> def y(): ... yield 1 ... >>> y1=y() >>> print y1 <generator object y at 0x0293C288> >>> for item in y1: ... print item ... 1 >>> def y(): ... yield 1 ... yield 2 ... yield 3 ... yield 4 ... yield 5 ... >>> y2=y() >>> print y2 <generator object y at 0x02A31670> >>> for item in y2: ... print item ... 1 2 3 4 5 >>>
>>> def AlexReadlines(): ... seek=0 ... while True: ... with open('c:/cc/abc.html','r') as f: ... f.seek(seek) ... data=f.readline() ... if data: ... seek=f.tell() ... yield data ... else: ... return ... >>> for item in AlexReadlines(): ... print item ... <h1>hello cccccccccc</h1> >>> print AlexReadlines() <generator object AlexReadlines at 0x02A32CD8>
with open不需要主动关闭文件流
>>> f=open('c:/cc/abc.html') >>> f.read() '<h1>hello cccccccccc</h1>' >>> f.close() >>> >>> with open('c:/cc/abc.html') as f: ... f.read() ... '<h1>hello cccccccccc</h1>' >>> def login(username): if username==’alex’: return ‘登陆成功’ else: return ‘登陆失败’
yield可以实现函数执行过程未完成时不用等待函数的执行结果,即不阻塞;当工程需要调用函数时,直接调用next()方法即可;后面再细讲
5、lambda函数
result= ‘gt’ if 1>3 else ‘lt’
等价于
tmp=None
if 1>3:
tmp=’gt’
else:
tmp=’lt’
匿名函数只能调用一次;
tmp=lambda x,y:x+y
相当于
def sum(x,y)
return x+y
http://www.cnblogs.com/wupeiqi/articles/4276448.html
6、内置函数
>>> map(lambda x:x+1,[1,2,3]) #all序列 [2, 3, 4] >>> filter(lambda x:x==1,[1,23,44]) #True序列 [1] >>> reduce(lambda x,y:x+y,[1,2,3]) #累加 6 >>>
enumerate将其组成一个索引序列,利用它可以同时获得索引和值
>>> l1=['钱','房子','女人'] >>> for item in enumerate(l1): ... print item ... (0, '\xc7\xae') (1, '\xb7\xbf\xd7\xd3') (2, '\xc5\xae\xc8\xcb') >>> for item in enumerate(l1): ... print item[0],item[1] ... 0 钱 1 房子 2 女人 >>>
占位符{},format替换占位符
>>> s='i am {0},{1}' >>> s.format('cxiong',29) 'i am cxiong,29'
字符串作为表达式运算
>>> a='8+8' >>> eval(a) 16 >>> b='4*2' >>> eval(b) 8
7、反射
__import__:字符串的形式导入模块
>>> tmp='sys' >>> model=__import__(tmp) >>> model.path ['', 'C:\\Python27\\lib\\site-packages\\pip-8.0.3-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\paramiko-1.16.0-py2.7.egg', 'C:\\WINDOWS\\SYSTEM32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages'] >>>
getattr:字符串的形式执行函数
mysql,sqlserver
>>> f=getattr(model,'path') >>> f ['', 'C:\\Python27\\lib\\site-packages\\pip-8.0.3-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\paramiko-1.16.0-py2.7.egg', 'C:\\WINDOWS\\SYSTEM32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages'] >>>
反射的应用1:
[root@localhost ~]# python27 index.py demo.foo [root@localhost ~]# cat demo.py #!/usr/bin/python27 #coding:utf-8 def Foo(): print 'demo.foo' [root@localhost ~]# cat index.py #!/usr/bin/python27 #coding:utf-8 str1='demo' str2='Foo' module=__import__(str1) func=getattr(module,str2) func() [root@localhost ~]#
反射的应用2:url反射
[root@localhost demo]# ls account.py account.pyc admin.py admin.pyc index.py __init__.py __init__.pyc reflect.py [root@localhost demo]# cat reflect.py #!/usr/bin/python27 #coding:utf-8 data=raw_input('请输入地址:') array=data.split('/') userspace=__import__(array[0]) #model=getattr(userspace,array[0]) func=getattr(userspace,array[1]) func() [root@localhost demo]# cat account.py #!/usr/bin/python27 #coding:utf-8 def login(): print 'login' def logout(): print 'logout' [root@localhost demo]# cat admin.py #!/usr/bin/python27 #coding:utf-8 def index(): print 'welcome to admin' [root@localhost demo]#
8、常用模块random
>>> import random >>> random.random() 0.20107276223352322 >>> random.random() 0.08696208484961188 >>> random.random() 0.2274291961816528 >>> random.randint(1,5) 5 >>> random.randint(1,5) 1 >>> random.randint(1,5) 1 >>> random.randint(1,5) 4 >>> random.randint(1,5) 3 >>>
应用场景:生成验证码
code=[] >>> for i in range(4): ... if i ==random.randint(1,4): ... print random.randint(1,4) ... else: ... tmp=random.randint(65,90) ... print chr(tmp)
9、常用模块hashlib:md5加密
>>> import hashlib >>> hash=hashlib.md5() #md5对象 >>> hash.update('admin') >>> hash.hexdigest() '21232f297a57a5a743894a0e4a801fc3' >>> hash.hexdigest()
10、常用模块:序列化-pickle
序列化:二进制格式将Python对象进行格式化为字符串形式;
反序列化:可以将加密的字符串转化为原有对象
用途及作用:只能在python中使用;数据存储,将python所有的对象(类、函数、字典、列表等)序列化为文件进行保存;
python与python程序之间内存空间数据交互;因为硬盘中只能存放字符串,无法存放数据对象;
>>> import pickle >>> l1=['cxiong',11,22,'ok','xmzhang'] >>> pickle.dumps(l1) "(lp0\nS'cxiong'\np1\naI11\naI22\naS'ok'\np2\naS'xmzhang'\np3\na." >>> s1=pickle.dumps(l1) >>> s1 "(lp0\nS'cxiong'\np1\naI11\naI22\naS'ok'\np2\naS'xmzhang'\np3\na." >>> type(s1) <type 'str'> >>> l1=pickle.loads(s1) >>> l1 ['cxiong', 11, 22, 'ok', 'xmzhang'] In [17]: pickle.dump(l1,open('/tmp/1.txt','w')) In [18]: exit [cxiong@localhost ~]$ cat /tmp/1.txt (lp0 S'cxiong' p1 aI11 aI22 aS'ok' p2 aS'xmzhang' p3 a. [cxiong@localhost ~]$ In [2]: pickle.load(open('/tmp/1.txt','r')) Out[2]: ['cxiong', 11, 22, 'ok', 'xmzhang']
11、常用模块:序列化-json
json:所有语言都支持的数据格式;json只能序列化常规的对象(字典、列表);json序列化后,字符串格式可见
json与pickle的区别
In [5]: name_dict={'name':'cxiong','age':29} In [6]: json.dumps(name_dict) Out[6]: '{"age": 29, "name": "cxiong"}' In [7]: pickle.dumps(name_dict) Out[7]: "(dp0\nS'age'\np1\nI29\nsS'name'\np2\nS'cxiong'\np3\ns."
12、常用模块re
字符:
\d:数字
\w:字母
\t:空白
次数:
*:
+:
?:
{m}:
{m,n}:
match从头开始匹配;search全局匹配;只匹配第一个
In [18]: r1=re.match('\d+','asdfasd123asdfwe32') In [19]: r2=re.search('\d+','asdfasd123asdfwe32') In [20]: r1 In [21]: r2 Out[21]: <_sre.SRE_Match at 0x2e28370> In [22]: r1.group() --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-22-d8a389c401ef> in <module>() ----> 1 r1.group() AttributeError: 'NoneType' object has no attribute 'group' In [23]: r2.grou r2.group r2.groupdict r2.groups In [23]: r2.group() Out[23]: '123'
findall匹配所有模式
In [24]: r3=re.findall('\d+','asdfasd123asdfwe32') In [25]: r3 Out[25]: ['123', '32']
compile编译模式
In [1]: import re In [3]: com=re.compile('\d+') In [4]: type(com) Out[4]: _sre.SRE_Pattern In [5]: com.findall('asdf123aadsf3454aafadsf523') Out[5]: ['123', '3454', '523']
groups()获取匹配组内容
In [6]: r2=re.search('(\d+)asdf(\d+)','1234asdf2345') In [7]: r2.group() Out[7]: '1234asdf2345' In [8]: r2.groups() Out[8]: ('1234', '2345')
资料:
https://deerchao.net/tutorials/regex/regex-1.htm
13、常用模块:time
三种表现形式:
时间戳:1970年1月1日之后的秒
元组 包含了:年、日、星期等...time.struct_time
格式化的字符串 2014-11-1111:11print time.time()
In [9]: import time In [10]: time.time() Out[10]: 1494069737.874593 In [11]: time.gmtime() Out[11]: time.struct_time(tm_year=2017, tm_mon=5, tm_mday=6, tm_hour=11, tm_min=26, tm_sec=8, tm_wday=5, tm_yday=126, tm_isdst=0) In [14]: time.strftime('%Y-%m-%d %H:%M:%S') Out[14]: '2017-05-06 04:28:22' #字符串格式--->元组格式 In [16]: time.strptime('2017-05-06','%Y-%m-%d') Out[16]: time.struct_time(tm_year=2017, tm_mon=5, tm_mday=6, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=126, tm_isdst=-1)
元组格式--->时间戳格式
In [17]: time.localtime() Out[17]: time.struct_time(tm_year=2017, tm_mon=5, tm_mday=6, tm_hour=4, tm_min=30, tm_sec=56, tm_wday=5, tm_yday=126, tm_isdst=1) In [18]: time.mktime(time.localtime()) Out[18]: 1494070270.0