描述python
Python是一種面向對象的解釋性高級編程語言。print、import語句、賦值語句、條件語句和循環語句等都是包含對象的表達式。編程
一、print緩存
print能夠打印一個表達式或者多個用逗號分隔開的表達式。表達式式要麼是字符串,要麼就被自動轉換爲字符串。數據結構
print目前實際上是一個函數:編程語言
print(dir(print()))
print函數返回值是 NoneType?執行如下代碼均會出現 error.函數
list(print('age', 2)) # TypeError: 'NoneType' object is not iterable len(print('age', 2)) # TypeError: object of type 'NoneType' has no len()
筆記:工具
一、print打印多個表達式,不一樣表達式之間用逗號分隔,則是默認分隔符爲空格。若是須要,能夠經過屬性 sep='_' 自定義分隔符。ui
二、不一樣表達式經過 + 鏈接以後的打印結果將沒有空格做爲分隔符。spa
三、print默認結束字符串爲換行符。若是須要,能夠經過屬性 end=‘ ’ 自定義空字符串爲結束字符串。rest
二、import語句
執行import語句,能夠導入整個模塊,也能夠導入模塊中的特定對象。
# 導入math整個模塊 # import 模塊1 import math math.sqrt(10) # from 模塊1 import *,不建議使用! from math import * sqrt(10) #導入math模塊裏面的sqrt from math import sqrt
筆記:
一、兩個不一樣的模塊可能包含有相同名稱的對象(全局變量和函數)。當這些模塊被同時導入到一個模塊中時,須要給其中一個模塊的對象賦予一個別名。Python解釋器是從上往下逐行執行代碼。若是不使用別名,Python解釋器執行該函數或其餘指令時,將調用的是程序中最後一個模塊中的對象。
from somemodule import somefunction as ...
二、有些模塊組成層次結構,即一個模快位於另外一個模塊中。
三、賦值語句
一、序列解包(可迭代對象解包):
將可迭代對象解包,並將獲得的值存儲到一系列變量。可迭代的對象包括列表,元組,字典和字符串,與索引或者鍵獲取可迭代對象的元素依次賦值給多個變量,序列解包並行給多個變量賦值。
num1, num2, *rest_num = [1, 2, 3, 4, 5] print(num1, num2, rest_num) a, *b, c = 'abc' print(a, b, c)
筆記:
一、* 運算符能夠收集多餘的值,可是帶 * 的變量最終包含的老是一個列表。
二、鏈式賦值
將多個變量關聯到同一個值。
import math x = y = math.sqrt(10) # 以上代碼與如下代碼等價 y = math.sqrt(10) x = y # 上面兩個代碼與如下代碼不等價 y = math.sqrt(10) x = math.sqrt(10)
三、加強賦值
加強賦值適用於全部的標準運算符,如 *、+、-、%、//、/等,加強賦值也適用於其餘數據類型:foo *= 2
四、代碼塊(一組語句)
代碼塊是一組語句。代碼塊是經過縮進代碼(增長空格)來建立的。縮進代碼塊能夠經過製表符,Python當中製表符解釋爲移到下一個製表位。(相鄰製表位間隔8個空格符),可是標準的Python代碼縮進是使用4個空格縮進代碼。
Python語言當中冒號:指出接下來的一組語句是代碼塊,並將代碼塊中的每一行代碼縮進相同程度。
五、條件語句
一、判斷-布爾值、比較運算符、布爾運算符
一、真值也稱爲布爾值。標準值:False,None,、各類數據類型:‘ ’,0,[],(),{} 都會被解釋器視爲假,而其餘值都被視爲真(包括 Ture)。
二、類型 bool 能夠裝換其餘值爲布爾值,在Python解釋器中值會被自動轉換。
三、對象相同可使用比較運算符:is;對象相等可使用比較運算符:==。is比較的是二者是不是同一個對象,因此比較的是內存地址(id是否相同),==是值比較。不可變對象,例如int,str,它會直接進行值比較。對於Python已知的對象,會調用他們的__eq__函數來比較。
四、對象緩存機制,Python會對比較小的對象緩存,下次用到比較小的對象(數,字符串)時,會去緩存區查找,若是找到,不會再開闢新的內存,而是繼續把小對象的地址賦給新的值。
""" x = 1 y = 1 print(x is y) print(id(x)) print(id(y)) """ z = [1, 2] y = [1, 2] print(z is y) print(z is [1, 2])
五、字符串和序列的比較,字符串的比較是利用函數 ord ,按照字符串中字符排列順序依次獲取字符在ASCII碼錶中的順序值並進行比較。序列的比較方式與字符串比較方式類似,可是序列包含的元素可能不是字符,其餘類型的元素如元組和列表等,也是根據一樣的規則對元素進行比較。
六、布爾運算符: and、 or、 not ,只作必要計算。若是使用布爾運算符,要注意表達式的前後順序,。如 表達式1 and 表達式2 ,只有表達式1爲真纔會執行表達式2,若是表達式1爲假,馬上返回假,而不會關心表達式2。
二、條件語句: if、elif、else
students_age =[15,16,12,14,17,12,10]; for age in students_age: if age == 10: print("current student's age is :" + str(age)); elif age == 12: print("the age of " + str(age) + " has two students"); else: print("age is older then 12");
筆記:
可迭代對象和迭代器,任何實現了__iter__
和__next__()
方法的對象都是迭代器,__iter__
返回迭代器自身,__next__
返回容器中的下一個值。range()函數返回的是一個可迭代對象,list() 函數是對象迭代器,把對象轉爲一個列表,返回的變量類型爲列表。
六、斷言語句 assert
斷言語句,提醒覈查程序是否知足預先設定的要求。邏輯解釋:if not codition:crash progam
num = input('give a number: ') assert 0 < num < 100, 'the number needs to be realistic'
七、條件語句 for 循環
在條件爲真時,反覆執行代碼塊。python時面向對象的語言,也就是條件爲真時,對象能夠反覆執行代碼塊,因此可進行 for 循環的對象都是可迭代的對象。可執行r 循環語句的對象確定是可迭代對象,可是可迭代對象不必定就能執行 for 循環語句。
一、迭代字典
y = {'a': 'b', (1, 2): 'c', 42: 'age'} for key in y: z = y.values() x = list(y.values()) print(key, "corresponds to:", z, x)
筆記:
一、方法:d.items、d.keys、d.values 返回值的數據類型是字典視圖,字典視圖只能肯定其長度(函數 len )和執行成員檢查( in )。
二、字典元素的排列順序是不肯定的。若是須要按照特定的順序迭代字典的鍵或者值,須要將鍵或者值放在列表中,對列表進行排序,而後以列表中的元素即鍵或者值進行迭代。
三、模塊collections中的OrderdDict類可讓映射記住其項的插入順序。
# 代碼來源:https://www.jianshu.com/p/3a49908295ce
In [1]: from collections import OrderedDict In [2]: favorite_language = OrderedDict() In [3]: favorite_language["zhangsan"] = "Enlish" In [4]: favorite_language["lisi"] = "Chinese" In [5]: favorite_language["wangwu"] = "French" In [6]: favorite_language Out[6]: OrderedDict([('zhangsan', 'Enlish'), ('lisi', 'Chinese'), ('wangwu', 'French')]) In [7]: for name, language in favorite_language.items(): ...: print(name +": " + language) ...: zhangsan: Enlish lisi: Chinese wangwu: French In [8]: type(favorite_language) Out[8]: collections.OrderedDict
四、迭代工具---模塊itertools、內置函數 zip、
模塊itertools
模塊裏面有一部分函數能夠幫助迭代序列。
函數 zip:
函數zip能夠將兩個序列「縫合」,返回一個由元組組成的序列(序列的元素都有編號,爲何不能經過索引獲取元組呢???)。返回值是一個適合迭代的對象,可使用list將其轉換爲列表。
num1 = [1, 2, 3, 4] num2 = ['day1', 'day2', 'day3'] x = zip(num1, num2) print((1, 'day1') in x) y = list(x) print((2, 'day2') in y) print(x) print(y) print(dir(zip()))
筆記:
函數zip和函數reversed返回的是一個能夠迭代的神祕對象。該對象能夠用於在for語句中使用判斷是否包含指定元素,或者調用join、list將可迭代的對象輸出爲字符串或者列表,可是該序列卻不能執行索引或者切片操做,也不能調用列表方法。
八、循環中間運行,特殊做用的語句
break語句:結束(跳出)循環。代碼重複一般被視爲壞事,while Ture:... ;if...:break技巧能夠是一種解決該問題的一種方法。
continue語句:結束當前迭代,並調到下一次迭代開頭
pass語句:python中的pass語句什麼都不執行,可是能夠修復Python問題。
del語句:刪除到對象的引用還會刪除名稱自己,致使該名稱未被定義,可是該對象沒有被刪除。
x = [x for x in range(1, 10, 2)] y = x print(x, y) del x print(y) print(x)
曾爲語句但現爲函數的 exec 和與其相關的 eval:exec將字符串當成代碼執行,因爲字符串裏面的內容可能會污染代碼的命名空間,須要向該函數傳遞一個字典做爲命名空間(scope = {} ,scope裏面還包含全部內置函數和值的字典__builtins__)。eval將字符串當成有效的表達式來求值,並返回結果。eval的結果能夠是字符,序列和映射等數據結構。不要濫用eval函數:不要直接使用eval直接轉換 input 的結果,由於可使用其餘模塊進行強大的操做。如:input輸入的是'__inport__('os').system('touch text')'將可直接操做項目內容,可能危害項目正常運行。
from math import sqrt scope = {} # 能夠在該命名空間添加一些值 scope['x'] = 1 exec('sqrt = 4',scope) print(dir(scope)) print(sqrt) print(sqrt(4))
print(eval(16*2))
print(eval('16*2'))
print(eval(input('what: ')))
九、列表推導
列表是從其餘列表建立列表的方式。列表推導裏面元素的循環語句能夠嵌套。
x = [x for x in range(1, 10, 2)] print(x)
筆記:
一、列表推導是代碼更改整潔
二、字典的使用可使代碼運算效率更高,由於字典能夠減小檢查的可能性。