1. 程式人生 > >python基礎和註意點概要

python基礎和註意點概要

www. 定時 blog open 沒有 pil use https 實例方法

1. 只有在形參表末尾的那些參數可以有默認參數值
例如,def func(a, b=1) 是有效的,但是 def func(a=1, b) 是無效的。

2. 默認參數的值是不可變的對象,比如None、True、False、數字或字符串
例如;def print_info( a , b = [] ): 就是錯誤的

3. 回調函數
定義:
一般情況下,應用程序會時常通過API調用庫裏所預先備好的函數。但是有些庫函數卻要求應用先傳給它一個函數,
好在合適的時候調用,以完成目標任務。這個被傳入的、後又被調用的函數就稱為回調函數。

打個比方:
有一家旅館提供叫醒服務,但是要求旅客自己決定叫醒的方法。可以是打客房電話,也可以是派服務員去敲門,
睡得死怕耽誤事的,還可以要求往自己頭上澆盆水。
“叫醒”這個行為是旅館提供的,相當於庫函數,
“叫醒的方式”是由旅客決定並告訴旅館的,也就是回調函數;
而旅客告訴旅館怎麽叫醒自己的動作,也就是把回調函數傳入庫函數的動作,稱為登記回調函數。

實例:
http://blog.csdn.net/tchenjx/article/details/51661173

4. 所有的變量都可以理解是內存中一個對象的“引用”
可變對象一旦創建之後還可改變但是地址不會發生改變,即該變量指向的還是原來的對象,不可變對象相反
strings, tuples, 和numbers是不可更改的對象,而 list, dict, set 等則是可以修改的對象

值傳遞:將參數a的值作為參數傳遞進去,程序運行完a的值不改變
引用傳遞:將參數a的地址傳遞進去,程序運行完a的值隨之改變

python不允許程序員選擇傳值還是傳引用,
如果函數接受的是一個不可變對象,則為值傳遞;
如果函數接受的是一個可變對象,則為引用傳遞。

匿名函數
lambda x,y: x+y
filter(lambda x:x>3,[1,2,3,4,5])

反轉字符串 text="abcdef"
1)text[::-1]
2)轉換成list,用其reverse函數


[:end:]和range(,end,) 都是輸出到end-1,比如:
text="abcdef"
print text[:5] #abcde

博客:
https://changchen.me/about/
http://ssdxiao.github.io/ 虛擬化

a = [1,2,3]
b = [4,5,6]
zipped = zip(a,b) # 打包為元組的列表[(1, 4), (2, 5), (3, 6)]
zip(*zipped) # 與 zip 相反,可理解為解壓,返回二維矩陣式[(1, 2, 3), (4, 5, 6)]


函數調用問題(下面代碼會輸出什麽)
https://www.cnblogs.com/zhangqigao/p/6397853.html 問題6
第3次是建立在第1次函數調用的基礎上,l = [0,1]


5. 實例方法/類方法/靜態方法

6. yield
iterables -> generators -> yield

列表推導式: mylist = [x*x for x in range(3)]

生成器也是叠代器的一種,但是你只能叠代它們一次.
原因很簡單,因為它們不是全部存在內存裏,它們只在要調用的時候在內存裏生成
mygenerator = (x*x for x in range(3))
生成器和叠代器的區別就是用()代替[],還有你不能用for i in mygenerator第二次調用生成器

Yield的用法和關鍵字return差不多,會返回一個生成器
Yield你必須先理解當你調用函數的時候,函數裏的代碼並沒有運行.函數僅僅返回生成器對象
每當for語句叠代生成器的時候你的代碼才會運轉


7. 當函數的參數不確定時,可以使用*args 和**kwargs,*args 沒有key值,**kwargs有key值。
http://blog.csdn.net/chenjinyu_tang/article/details/8136841


8. 爬蟲
1. urllib2庫、xpath
獲取標簽內的text
info = bloger[0].xpath(‘string(.)‘).encode(‘utf-8‘).strip()

文件轉化為html格式進行分析
from lxml import etree
record = open("test.html",‘r‘)
tree = etree.HTML(record.read())
desc = tree.xpath("//dt[text()=‘Bugzilla:‘]")[0].getnext().xpath(‘string(.)‘)
pattern = re.compile("CVE-\d+-\d+ .*:")
print re.findall(r" (.*):", pattern.findall(desc)[0])[0]


2. excel
import xlwt
workbook = xlwt.Workbook()
sheet = workbook.add_sheet(‘sheet‘,cell_overwrite_ok=True)
sheet.write(0, 0, ‘EnglishName‘) #(行,列,寫入內容)
workbook.save(‘test.xls‘)


3. 正則
record = open(suse_path+cve,"r").read() #文本內容轉化為string
pattern = re.compile("h4\>\n.*\n\<hr\>")
print pattern.findall(record)[0]


9. 新式類是廣度優先,舊式類是深度優先

10. 淺拷貝和深拷貝
直接賦值:傳遞對象的引用而已,原始列表改變,被賦值的b也會做相同的改變
淺拷貝:子對象沒有拷貝,所以原始數據改變,子對象會改變
深拷貝:全部拷貝,原始數據怎麽變也不會導致拷貝後的元素改變

11.使用for從序列中得到的每一個對象,事實上都是從原序列中復制了一份。
因此對此對象進行處理時,只是處理了復制體,並沒有影響到原序列

python基礎和註意點概要