Python系列之lambda、函数、序列化
lambda函数:
在python中使用lambda来创建匿名函数,而用def创建的方法是有名称的,除了从表面上的方法名不一样外,python lambda还有哪些和def不一样呢?
- 1 python lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def则会把函数对象赋值给一个变量。
- 2 python lambda它只是一个表达式,而def则是一个语句
下面是python lambda的格式,看起来好精简:
lambda x: print(x)
下面举几个例子:
1 def su(func): 2 return func +2 3 for x in range(10): 4 ret = su(x) 5 #------------------------------------# 两个例子输出的结果是一样的[2,3,4,5,6,7,8,9,10,11] 6 g = lambda x:x+2 7 info = [g(x) for x in range(10)]
函数:
曾多次提到函数,函数到底是什么东东,那我们就一探究竟。首先先说下 为什么要用函数?
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率。
定义函数:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
语法:
def functionname( parameters ): function_suite return [expression]
返回值
def foo(func): return func + 1 #return,表示函数的返回值
python 函数返回值有两种形式:
- 返回一个值。
- 返回多个值
默认返回None。
参数
- 必备参数 : 必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样
- 关键字参数: 关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
- 默认参数 :调用函数时,缺省参数的值如果没有传入,则被认为是默认值。
- 不定长参数: 函数能处理比当初声明时更多的参数
#必备参数 def foo(func): print(func) foo('hello') #hello #关键字参数 def foo(func): print(func) foo(func = 'hello') #hello #缺省参数 def printinfo( name, age = 35 ): print("Name: ", name) print("Age ", age) printinfo( age=50, name="miki" ) #Name: miki,Age 50 printinfo( name="miki" ) #Name: miki,Age 35 #不定长参数 def functionname(*args,**kwargs): print('输出:%s'%args) functionname(['ok',11,22,33]) #输出:['ok', 11, 22, 33]
pickle 和json 是序列化的两个模块。
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
pickle
首先,我们尝试把一个对象序列化并写入文件:
1 accounts = { 2 'k1':'hello', 3 'k2':'world' 4 } 5 f = open('dump.txt','wb') 6 f.write(pickle.dumps(accounts)) 7 f.close()
accounts = { 'k1' : 'hello' , 'k2' : 'world' } f = open ( 'dump.txt' , 'wb' ) f.write(pickle.dumps(accounts)) f.close() |
pickle.dumps()把任意对象序列化成一个str,然后,就可以把这个str写入文件.或者用另一个方法pickle.dump()
直接把对象序列化后写入一个文件:
1
2
3
|
f = open ( 'dump.txt' , 'wb' ) pickle.dump(accounts,f) f.close() |
看看写入的dump.txt
文件,一堆乱七八糟的内容,这些都是Python保存的对象内部信息。
当然有序列化也有反序列化,我们把dump.txt的一堆乱码给还原:
1
2
3
|
f = open ( 'dump.txt' , 'rb' ) ret = pickle.loads(f.read()) f.close() |
当然我们也可以直接用pickle.load()方法从dump.txt中直接反序列化出对象:
1
2
3
|
f = open ( 'dump.txt' , 'rb' ) pickle.load(f) f.close() |
son
如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。
1
2
3
4
5
6
7
8
|
accounts = { 'k1' : 'hello' , 'k2' : 'world' } f = open ( 'dump.txt' , 'w' ) f.write(json.dumps(accounts)) f.close() |
打开dump.txt 文件内容不在是乱码,并且是可读的
1
|
{ "k1" : "hello" , "k2" : "world" } |
由此可见dumps()
方法返回一个str。内容就是标准的JSON。类似的,
dump()
方法可以直接把JSON写入一个file-like Object
。
1
2
3
|
f = open ( 'dump.txt' , 'w' ) json.dump(accounts,f) f.close() |
要把JSON反序列化为Python对象,用loads()
或者对应的load()
方法,前者把JSON的字符串反序列化,后者从file-like Object
中读取字符串并反序列化:
1
2
3
|
f = open ( 'dump.txt' , 'r' ) c = json.loads(f.read()) f.close() |
有一点需要注意,就是反序列化得到的所有字符串对象默认都是unicode
而不是str
。由于JSON标准规定JSON编码是UTF-8,所以我们总是能正确地在Python的str
或unicode
与JSON的字符串之间转换。
1 import smtplib 2 from email.mime.text import MIMEText 3 from email.utils import formataddr 4 5 6 msg = MIMEText('邮件内容', 'plain', 'utf-8') 7 msg['From'] = formataddr(["武沛齐",'wptawy@126.com']) 8 msg['To'] = formataddr(["走人",'424662508@qq.com']) 9 msg['Subject'] = "主题" 10 11 server = smtplib.SMTP("smtp.126.com", 25) 12 server.login("wptawy@126.com", "邮箱密码") 13 server.sendmail('wptawy@126.com', ['424662508@qq.com',], msg.as_string()) 14 server.quit() 15 16 发邮件实例
本文来自博客园,作者:热爱技术的小牛,转载请注明原文链接:https://www.cnblogs.com/my-blogs-for-everone/p/7766455.html