python內置函數和序列化
阿新 • • 發佈:2018-07-02
getattr 絕對值 end adl hex 直接 加密 tor ext 修改字符集
全局修改
點擊window
針對某一個工程
右鍵,有一個屬性propertes
給某個文件,也就是前面加
也是右鍵屬性,這裏就不在說了
#模塊的和模塊的常用方法
- 至關重要的__init__.py
如果想導入成模塊,一定要有這個文件 - 是否為主文件__name
if name == ‘\main__‘
如果不是主文件返回模塊文件路徑+文件名 - 當前文件 :__doc__
返回模塊級別的註釋,函數級別的註釋,是在函數下面加6個引號,中間寫註釋 - __file__:輸出當前的路徑
函數式編程
- 參數 def Fun(arg,*args,**kergs)
- 默認參數 print arg
- 可變參數 print *args print **kergs
- 返回值 return ‘success’
#!/usr/bin/env python #coding:utf-8 def login(username): if username == "alex": print "登錄成功" else: print "登錄失敗" if __name__ == "__main__": user = raw_input(‘username:‘) login(user)
yield
print range(10) for item in xrange(10): print item #輸出的時候並沒有全部創建,他只是一個生成器,說明他沒有寫入內存中 #也就是說每一次創建就只創建一個整數 def foo(): yield 1 re = foo() print re 輸出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 1 2 3 4 5 6 7 8 9 <generator object foo at 0x00000000030B8480>
def fool():
yield 1
yield 2
yield 3
yield 4
#他的執行過程是,第一從從yield 1 執行,下一次直接從yield2開始執行
re = fool()
print re
#生成了一個生成器,每次遍歷只生成一條
for item in re :
print item
結果:
<generator object fool at 0x0000000003248480>
1
2
3
4
def ReadLines(): seek = 0 while True: with open(‘E:/temp.txt‘,‘r‘) as f : f.seek(seek) date = f.readline() if date: seek = f.tell() yield date else: return print ReadLines() for item in ReadLines(): print item
三元運算和lambda表達式
三元運算
- 代碼實例:
result = ‘gt’ if 1>3 else ‘it’
print result - Lambda表達式()
代碼實例:
a = lambda x,y: x+y
print a(1,2) - map函數()
map (lambda x:x*2,range(10))
意思就是將range的每個值賦給前邊內置函數
- dir()列出當前文件內置的變量或者方法名,只列出key
- vars()和dir()不一樣的是列出key和value
- type() 查看你所創建變量的類型
a = [] ,本質上是調用一個類,去生成一個列表,本質上是創建了一個類的實例,像tuple就是一個類的名字 - from file import demo
- reload(demo)
重新導入 - id()
查看變量的數據 - cmp()函數
cmp(x,y) 函數用於比較 2 個對象,如果 x< y 返回 -1,如果 x==y 返回 0,如果 x>y 返回 1。 - abs()取絕對值
- bool()將結果換算成布爾值
- divmod()
計算結果,將商和余數一元組的方式返回 - max([]) 最大值
- min([]) 最小值
- sum([]) 求和
- pow() 指數運算
- len() 計算長度(如果是中文則表示字節的長度)
- all(可叠代的對象) 可叠代對象所有的都為真,則返回Ture,否則返回False
- any(可叠代的對象) 有一個為真則返回Ture
- chr(65) 查看字符
- ord(‘a’) 查看ascall值
- hex() 16進制
- bin() 10進制
- oct() 8進制
- range()
- xrange()
- enumerate(
for k,v in enumerate([1,2,3,4]): print k,v 輸出: 0 1 1 2 2 3 3 4
#為程序增加一個序號 li = [‘手表‘,‘汽車‘,‘房‘] for item in enumerate(li,1): print item[0],item[1] #1為初始值 1 手表 2 汽車 3 房
- apply執行函數和函數的調用
def say():
print ‘say in‘
apply(say)
輸出 ;say in - map函數() #遍歷後面每一個序列的函數
map (lambda x:x*2,range(10))
意思就是將range的每個值賦給前邊(可以是函數)lala = []; def foo(arg): return arg + 100 li = [11,22,33] lala = map(foo,li) print lala 結果: [111, 122, 133] #也可以使用 lala.append(item+100) temp = map (lambda arg:arg+100,li)
- filter函數 #條件為真,將其加入序列中
temp = [] li = [11,22,33] def foo(arg): if arg <22: return True else: return False temp = filter(foo,li) print temp 將li序列中滿足條件的返回temp序列中 結果:11
- reduce 累加(只能兩個參數)
print reduce(lambda x,y:x+y,[1,2,3] ) 結果 6 將前一次的計算結果,傳遞為第二次計算的第一個參數
- zip 函數 #將列表中的第一個組成新的列表
x = [1,2,3]
y = [4,5,6]
z = [4,5,6]
print zip(x,y,z)
結果:
[(1, 4, 4), (2, 5, 5), (3, 6, 6)] - eval函數 #直接計算字符串類型的運算
a =‘8*8‘ print eval(a) 結果:64
字符串的格式化
s = ‘i am {0},{1}‘
print s.format(‘alex‘,‘xxx‘)
i am alex,xxx反射 通過字符串的形式導入模塊,並以字符串的形式執行函數 (動態切換數據庫連接)
不允許使用import os 導入,用temp的方法導入
temp = ‘os‘ model = __import__(temp) print model print model.path 輸出: <module ‘os‘ from ‘D:\pycharm\lib\os.pyc‘> <module ‘ntpath‘ from ‘D:\pycharm\lib\ntpath.pyc‘>
getattr就是在mysqlhelper模塊中查找count函數
Function就等於調用的count函數
相應的有delattr()、hasattr()判斷函數中是否含有相應的模塊
#使用random生成驗證碼
它使用的是ascall的值進行生成的
import random
print random.random()
print random.randint(1,5)
#生成1-5之間的隨機整數
print random.randrange(1,3)
#生成大於等於1,小於3的隨機數
import random
code = []
for i in range(6):
if i == random.randint(1,5):
code.append(str(random.randint(1,5)))
else:
temp = random.randint(65,90)
code.append(chr(temp))
print ‘‘.join(code)
#註意:join和+=的區別
join效率更高,+=每次都要在內存中請求一塊空間,join只申請一次
md5加密
#!/usr/bin/env python
#coding:utf-8
import hashlib
hash=hashlib.md5()
hash.update(‘admin‘)
print hash.hexdigest()
print hash.digest()
21232f297a57a5a743894a0e4a801fc3
!#/)zW??C?JJ???
#md5不能反解
序列化和JSON
應用實例:(python 和python之間傳輸文件,單機遊戲實時保存)
為什麽要序列化?
一個程序將列表存在一個程序中,另一個程序使用這個文件的時候。使用序列化之後在讓另一個程序去讀取的話,使兩個python程序之間內存數據之間的交換,兩個獨立的進程在內存中看,他們的內存空間不能互相訪問,如果兩個程序之間不僅僅只是簡單的列表共享,還想其他數據交換,數據可能比較復雜。而且硬盤只能存字符串類型的數據,只能通過系列化,存入文件,另一個程序然後讀取文件的內容,然後將其反序列化之後,在加載到內存中
序列化:把一個對象或(一個列表、字典),把對象通過Python特有的機制序列化,序列化就是以特殊的形式以過二進制的方式給對象加密,並且序列化之後可以反序列化。
序列化
import pickle
li = [‘axex‘,11,22,‘ok‘,‘sb‘]
print pickle.dumps(li)
print type(pickle.dumps(li))
輸出結果:
(lp0
S‘axex‘
p1
aI11
aI22
aS‘ok‘
p2
aS‘sb‘
p3
a.
<type ‘str‘>
#是一個沒有規則的字符串類型
反序列化
import pickle
li = [‘axex‘,11,22,‘ok‘,‘sb‘]
dumpsed = pickle.dumps(li)
print type(dumpsed)
loadsed = pickle.loads(dumpsed)
print loadsed
print type(loadsed)
<type ‘str‘>
[‘axex‘, 11, 22, ‘ok‘, ‘sb‘]
<type ‘list‘>
將列表序列化到一個文件中
import pickle
li = [‘axex‘,11,22,‘ok‘,‘sb‘]
pickle.dump(li,open(‘E:/temp.pk‘,‘w‘))
result = pickle.load(open(‘E:/temp.pk‘,‘r‘))
#將文件中反序列化
JSON:一種標準化的數據格式,把不同格式的數據JSON化。
##兩種序列化的區別
- pickle只能在python中使用
- JSON是所有的語言都支持的接口
- pickle 不但可以dump常規的數據類型,比如,字典、列表、集合,還可以序列化類、對象,基本上所有的類型都可以實現序列化,JSON只能序列化常規的數據類型。因為,在不同的語言中類的格式不同。
- pickle 序列化的序列的數據不可讀,但是JSON的數據格式是用人眼可以看出來他的格式
import json name_dic = {‘name‘:‘wupeiqi‘,‘age‘:23} print json.dumps(name_dic) 輸出結果:全部變成字符串 {"age": 23, "name": "wupeiqi"}
為什麽多個了U呢,因為在存入內存中使用Unicode,你本事是utf-8,然後反序列化之後又變成Unicode
python內置函數和序列化