本節內容
1.Python PYC
2.Python數據類型
3.數據運算
4.列表、元組操作
5.元組
6.字符串操作
7.字典操作
1.Python PYC
預編譯後的字節碼
1.1Python是一門解釋型語言?
初學Python一直聽別人說,Python是一門解釋性語言,直到發現了.pyc文件的存在。如果是解釋型語言,那麼生成的.pyc文件是什麼呢?c應該是compiled的縮寫纔對啊!
爲了防止其他學習Python的人也被這句話誤解,那麼我們就在文中來澄清下這個問題,並且把一些基礎概念給理清。
1.2解釋型語言和編譯型語言
計算機是不能夠識別高級語言的,所以當我們運行一個高級語言程序的時候,就需要一個“翻譯機”來從事把高級語言轉變成計算機能讀懂的機器語言的過程。這個過程分成兩類,第一種是編譯,第二種是解釋。
編譯型語言在程序執行之前,先會通過編譯器對程序執行一個編譯的過程,把程序轉變成機器語言。運行時就不需要翻譯,而直接執行就可以了。最典型的例子就是C語言。
解釋型語言就沒有這個編譯的過程,而是在程序運行的時候,通過解釋器對程序逐行作出解釋,然後直接運行,最典型的例子是Ruby。
通過以上的例子,我們可以來總結一下解釋型語言和編譯型語言的優缺點,因爲編譯型語言在程序運行之前就已經對程序做出了“翻譯”,所以在運行時就少掉了“翻譯”的過程,所以效率比較高。但是我們也不能一概而論,一些解釋型語言也可以通過解釋器的優化來在對程序做出翻譯時對整個程序做出優化,從而在效率上超過編譯型語言。
此外,隨着Java等基於虛擬機的語言的興起,我們又不能把語言純粹地分成解釋型和編譯型這兩種。
用Java來舉例,Java首先是通過編譯器編譯成字節碼文件,然後在運行時通過解釋器給解釋成機器文件。所以我們說Java是一種先編譯後解釋的語言。
1.3Python到底是什麼
Python也是一門基於虛擬機的語言,我們先來從表面上簡單地瞭解一下Python程序的運行過程吧。
當我們在命令行中輸入python hello.py時,其實是激活了Python的“解釋器”,告訴“解釋器”:你要開始工作了。可是在“解釋”之前,其實執行的第一項工作和Java一樣,是編譯。
Python是一門先編譯後解釋的語言。
1.4簡述Python的運行過程
在說這個問題之前,我們先來說兩個概念,PyCodeObject和pyc文件。
我們在硬盤上看到的pyc自然不必多說,而其實PyCodeObject則是Python編譯器真正編譯成的結果。我們先簡單知道就可以了,繼續向下看。
當python程序運行時,編譯的結果則是保存在位於內存中的PyCodeObject中,當Python程序運行結束時,Python解釋器則將PyCodeObject寫回到pyc文件中。
當python程序第二次運行時,首先程序會在硬盤中尋找pyc文件,如果找到則直接載入,否則就重複上面的過程。
所以我們應該這樣來定位PyCodeObject和pyc文件,我們說pyc文件其實是PyCodeObject的一種持久化保存方式。
2.Python數據類型
2.1 int(整數)
1.在32位機器上,整數的位數爲32位,取值範圍爲-2**31~2**31-1,即-2147483648~2147483647
2.在64位系統上,整數的位數爲64位,取值範圍爲-2**63~2**63-1,即-9223372036854775808~9223372036854775807
2.2 long(長整型)
注:python3不存在長整型,變爲整型,需要注意。
1.跟C語言不同,Python的長整數沒有指定位寬,
2.即:Python沒有限制長整數數值的大小,但實際上由於機器內存有限,我們使用的長整數數值不可能無限大。
3.注意,自從Python2.2起,如果整數發生溢出,Python會自動將整數數據轉換爲長整數,所以如今在長整數數據後面不加字母L也不會導致嚴重後果了。
2.3 float(浮點型)
1.浮點數用來處理實數,即帶有小數的數字。
2.浮點表示的形式是小數,但小數不一定都是浮點型,23和52.3E-4是浮點數的例子。E標記表示10的冪。在這裏,52.3E-4表示52.3 * 10-4。
2.4 complex(複數)
複數由實數部分和虛數部分組成,一般形式爲x+yj,其中的x是複數的實數部分,y是複數的虛數部分,這裏的x和y都是實數。
注:Python中存在小數字池:-5 ~ 257
2.5 布爾值
真或假
1或0
xuliangwei:~ xuliangwei$ python3
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 26 2016, 10:47:25)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 0
>>> if a :print("a")
...
>>> a =1
>>> if a :print("a")
...
a
2.6 查看數據類型
xuliangwei:~ xuliangwei$ Python3
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 26 2016, 10:47:25)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print (type("xuliangwei.com"))
<class 'str'> #字符串
>>> print (type(1.22))
<class 'float'> #浮點
>>> print (type(1))
<class 'int'> #整數
3.數據運算
3.1算術運算
操作符 | 描述符 | 示例 |
+ | 加法 - 對操作符的兩側增加值 | a + b = 30 |
- | 減法- 減去從左側操作數右側操作數 | a - b = -10 |
* | 乘法 - 相乘的運算符兩側的值 | a * b = 200 |
/ | 除 - 由右側操作數除以左側操作數 | b / a = 2 |
% | 模 - 由右側操作數和餘返回除以左側操作數 | b % a = 0 |
** | 指數- 執行對操作指數(冪)的計算 | a**b = 10 的冪 20 |
// | 取整除 - 操作數的除法,其中結果是將小數點後的位數被除去的商。 | 9//2 = 4 而 9.0//2.0 = 4.0 |
3.2比較運算
運算符 | 描述符 | 示例 |
== | 檢查,兩個操作數的值是否相等,如果是則條件變爲真。 | (a == b) 不爲 true. |
!= | 檢查兩個操作數的值是否相等,如果值不相等,則條件變爲真。 | (a != b) 爲 true. |
<> | 檢查兩個操作數的值是否相等,如果值不相等,則條件變爲真。 | (a <> b) 爲 true。這個類似於 != 運算符 |
> | 檢查左操作數的值是否大於右操作數的值,如果是,則條件成立。 | (a > b) 不爲 true. |
< | 檢查左操作數的值是否小於右操作數的值,如果是,則條件成立。 | (a < b) 爲 true. |
>= | 檢查左操作數的值是否大於或等於右操作數的值,如果是,則條件成立。 | (a >= b) 不爲 true. |
<= | 檢查左操作數的值是否小於或等於右操作數的值,如果是,則條件成立。 | (a <= b) 爲 true. |
3.3賦值運算
運算符 | 描述符 | 示例 |
= | 簡單的賦值運算符,賦值從右側操作數左側操作數 | c = a + b將指定的值 a + b 到 c |
+= | 加法AND賦值操作符,它增加了右操作數左操作數和結果賦給左操作數 | c += a 相當於 c = c + a |
-= | 減AND賦值操作符,它減去右邊的操作數從左邊操作數,並將結果賦給左操作數 | c -= a 相當於 c = c - a |
*= | 乘法AND賦值操作符,它乘以右邊的操作數與左操作數,並將結果賦給左操作數 | c *= a 相當於 c = c * a |
/= | 除法AND賦值操作符,它把左操作數與正確的操作數,並將結果賦給左操作數 | c /= a 相當於= c / a |
%= | 模量AND賦值操作符,它需要使用兩個操作數的模量和分配結果左操作數 | c %= a is equivalent to c = c % a |
**= | 指數AND賦值運算符,執行指數(功率)計算操作符和賦值給左操作數 | c **= a 相當於 c = c ** a |
//= | 地板除,並分配一個值,執行地板除對操作和賦值給左操作數 | c //= a 相當於 c = c // a |
3.4位運算
操作符 | 描述符 | 示例 |
& | 二進制和複製操作了一下,結果,如果它存在於兩個操作數。 | (a & b) = 12 即 0000 1100 |
| | 二進制或複製操作了一個比特,如果它存在一個操作數中。 | (a | b) = 61 即 0011 1101 |
^ | 二進制異或運算符的副本,如果它被設置在一個操作數而不是兩個比特。 | (a ^ b) = 49 即 0011 0001 |
~ | 二進制的補運算符是一元的,並有“翻轉”位的效果。 | (~a ) = -61 即 1100 0011以2的補碼形式由於帶符號二進制數。 |
<< | 二進位向左移位運算符。左操作數的值左移由右操作數指定的位數。 | a << 2 = 240 即 1111 0000 |
>> | 二進位向右移位運算符。左操作數的值是由右操作數指定的位數向右移動。 | a >> 2 = 15 即 0000 1111 |
3.5邏輯運算
運算符 | 描述 | 示例 |
and | 所謂邏輯與運算符。如果兩個操作數都是真的,那麼則條件成立。 | (a and b) 爲 true. |
or | 所謂邏輯OR運算符。如果有兩個操作數都是非零然後再條件變爲真。 | (a or b) 爲 true. |
not | 所謂邏輯非運算符。用於反轉操作數的邏輯狀態。如果一個條件爲真,則邏輯非運算符將返回false。 | not(a and b) 爲 false. |
3.6三元運算
result = 值1 if 條件 else 值2
xuliangwei:~ xuliangwei$ python3
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 26 2016, 10:47:25)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a,b,c = 1,3,5 #定義值
>>> d = a if a>b else c
>>> d
5
>>> d = a if a <b else c
>>> d
1
3.7進制類型
二進制,01
八進制,01234567
十進制,0123456789
十六進制,0123456789ABCDEF
3.8bytes類型
Python 3最重要的新特性大概要算是對文本和二進制數據作了更爲清晰的區分。文本總是Unicode,由str類型表示,二進制數據則由bytes類型表示。Python 3不會以任意隱式的方式混用str和bytes,正是這使得兩者的區分特別清晰。你不能拼接字符串和字節包,也無法在字節包裏搜索字符串(反之亦然),也不能將字符串傳入參數爲字節包的函數(反之亦然)。這是件好事。
不管怎樣,字符串和字節包之間的界線是必然的,下面的圖解非常重要,務請牢記於心:
#!/usr/bin/env python
# Author:xuliangwei
#encode 編碼
#decode 解碼
msg = "徐亮偉架構師之路"
print (msg)
print (msg.encode(encoding="utf-8")) #轉換爲bytes
print (msg.encode("utf-8").decode(encoding="utf-8")) #轉爲字符串
執行結果
徐亮偉架構師之路
b'\xe5\xbe\x90\xe4\xba\xae\xe4\xbc\x9f\xe6\x9e\xb6\xe6\x9e\x84\xe5\xb8\x88\xe4\xb9\x8b\xe8\xb7\xaf '
徐亮偉架構師之路
4. 列表、元組操作
列表是我們最以後最常用的數據類型之一,通過列表可以對數據實現最方便的存儲、修改等操作
4.1定義列表
names = ['Alex',"Tenglan",'Eric']
通過下標訪問列表中的元素,下標從0開始計數
>>> names[0]
'Alex'
>>> names[2]
'Eric'
>>> names[-1]
'Eric'
>>> names[-2] #還可以倒着取
'Tenglan'
4.2切片:取多個元素
注:列表的切片原則爲 顧頭不顧尾
>>> names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"]
>>> names[1:4] #取下標1至下標4之間的數字,包括1,不包括4
['Tenglan', 'Eric', 'Rain']
>>> names[1:-1] #取下標1至-1的值,不包括-1
['Tenglan', 'Eric', 'Rain', 'Tom']
>>> names[0:3]
['Alex', 'Tenglan', 'Eric']
>>> names[:3] #如果是從頭開始取,0可以忽略,跟上句效果一樣
['Alex', 'Tenglan', 'Eric']
>>> names[3:] #如果想取最後一個,必須不能寫-1,只能這麼寫
['Rain', 'Tom', 'Amy']
>>> names[3:-1] #這樣-1就不會被包含了
['Rain', 'Tom']
>>> names[0::2] #後面的2是代表,每隔一個元素,就取一個
['Alex', 'Eric', 'Tom']
>>> names[::2] #和上句效果一樣
['Alex', 'Eric', 'Tom']
4.3追加
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy']
>>> names.append("我是新來的")
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新來的']
4.4插入
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新來的']
>>> names.insert(2,"強行從Eric前面插入")
>>> names
['Alex', 'Tenglan', '強行從Eric前面插入', 'Eric', 'Rain', 'Tom', 'Amy', '我是新來的']
>>> names.insert(5,"從eric後面插入試試新姿勢")
>>> names
['Alex', 'Tenglan', '強行從Eric前面插入', 'Eric', 'Rain', '從eric後面插入試試新姿勢', 'Tom', 'Amy', '我是新來的']
4.5修改
>>> names
['Alex', 'Tenglan', '強行從Eric前面插入', 'Eric', 'Rain', '從eric後面插入試試新姿勢', 'Tom', 'Amy', '我是新來的']
>>> names[2] = "該換人了"
>>> names
['Alex', 'Tenglan', '該換人了', 'Eric', 'Rain', '從eric後面插入試試新姿勢', 'Tom', 'Amy', '我是新來的']
4.6刪除
>>> del names[2]
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', '從eric後面插入試試新姿勢', 'Tom', 'Amy', '我是新來的']>>> del names[4]
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新來的']
>>>
>>> names.remove("Eric") #刪除指定元素
>>> names
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', '我是新來的']
>>> names.pop() #刪除列表最後一個值 '我是新來的'
>>> names
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy']
4.7擴展
>>> names
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy']
>>> b = [1,2,3]>>> names.extend(b) #將列表b的內容複製到列表names中。
>>> names
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
4.8拷貝
>>> names
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
>>> name_copy = names.copy()
>>> name_copy
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
4.8.1深copy
name=["1","2","3"]
print ("name:%s" %name)
print ("---")
import copy
name1=copy.deepcopy(name)
print ("name1:%s" %name1)
結果:
name:['1', '2', '3']
---
name1:['1', '2', '3']
深入理解
import copy
name=["1","2","3"]
print ("name:%s" %name)
name2=copy.deepcopy(name)
print("name:%s" %name2)
name[1]="b"
print ("name:%s name2:%s"%(name,name2))
結果:
name:['1', '2', '3']
name:['1', '2', '3']
name:['1', 'b', '3'] name2:['1', '2', '3']
4.9統計
>>> names
['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3]
>>> names.count("Amy")2
4.10排序&翻轉
>>> names
['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3]
>>> names.sort() #排序
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < str() #3.0裏不同數據類型不能放在一起排序了,擦
>>> names[-3] = '1'
>>> names[-2] = '2'
>>> names[-1] = '3'
>>> names
['Alex', 'Amy', 'Amy', 'Tenglan', 'Tom', '1', '2', '3']
>>> names.sort()>>> names
['1', '2', '3', 'Alex', 'Amy', 'Amy', 'Tenglan', 'Tom']
>>> names.reverse() #反轉
>>> names
['Tom', 'Tenglan', 'Amy', 'Amy', 'Alex', '3', '2', '1']
4.11獲取下標
>>> names
['Tom', 'Tenglan', 'Amy', 'Amy', 'Alex', '3', '2', '1']
>>> names.index("Amy")2 #只返回找到的第一個下標
例:
list=['xiaofeng.gao','zhourui']
list[list.index('zhourui')]='ganna'
print (list)
>>>['xiaofeng.gao', 'ganna']
5.元組
元組其實跟列表差不多,也是存一組數,只不是它一旦創建,便不能再修改,所以又叫只讀列表
語法
1 | names = ( "alex" , "jack" , "eric" ) |
它只有2個方法,一個是count,一個是index,完畢。
程序練習
請閉眼寫出以下程序。
程序:購物車程序
需求:
啓動程序後,讓用戶輸入工資,然後打印商品列表
允許用戶根據商品編號購買商品
用戶選擇商品後,檢測餘額是否夠,夠就直接扣款,不夠就提醒
可隨時退出,退出時,打印已購買商品和餘額
6. 字符串操作
利用字符串操作:
name2="my name is {name} and age is {age}"
print (name2.format(name="alex",age="22"))
結果:
my name is alex and age is 22
利用字典操作
n3_arg={'name':'alex','age':33}
n3='my name is {name} and age is {age}'
print(n3.format(name=n3_arg['name'],age=n3_arg['age']))
結果:
'my name is alex and age is 33'
n4="Hello Word"
>>> n4.ljust(40,"-")
'Hello 2orld-----------------------------'
>>> n4.rjust(40,"-")'
-----------------------------Hello 2orld'
>>> s = "Hello World!"
>>> p = str.maketrans("abcdefg","3!@#$%^")
>>> s.translate(p)'H$llo Worl#!
>>> b="ddefdsdff_哈哈"
>>> b.isidentifier() #檢測一段字符串可否被當作標誌符,即是否符合變量命名規則True
>>>name2="asdf {name} sdf {year}"
>>>print (name2.format(name="alex",year="22"))
>>>asdf alex sdf 22
7. 字典操作
字典一種key - value 的數據類型,使用就像我們上學用的字典,通過筆劃、字母來查對應頁的詳細內容。
語法:
info = { 'stu1101': "zhangsan", 'stu1102': "lizi", 'stu1103': "wangwu", }
7.1字典的特性:
dict是無序的
key必須是唯一的,so 天生去重
7.2增加
info={ 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1101': 'TengLan Wu' } info["stu1104"] = "蒼井空" print(info)
7.3修改
info={ 'stu1102': 'LongZe Luola', 'stu1104': 'cangjingkong', 'stu1103': 'XiaoZe Maliya', 'stu1101': 'TengLan Wu' } info["stu1104"] = "蒼井空" print(info)
7.4刪除
>>> info {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1101': '武藤蘭'} >>> info.pop("stu1101") #標準刪除姿勢'武藤蘭' >>> info {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}>>> del info['stu1103'] #換個姿勢刪除 >>> info {'stu1102': 'LongZe Luola'} >>> >>> >>> >>> info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'} >>> info {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'} #隨機刪除 >>> info.popitem() ('stu1102', 'LongZe Luola')>>> info {'stu1103': 'XiaoZe Maliya'}
7.5查找
>>> info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'} >>> >>> "stu1102" in info #標準用法True >>> info.get("stu1102") #獲取'LongZe Luola' >>> info["stu1102"] #同上,但是看下面'LongZe Luola' >>> info["stu1105"] #如果一個key不存在,就報錯,get不會,不存在只返回NoneTraceback (most recent call last): File "<stdin>", line 1, in <module>KeyError: 'stu1105'
7.6多級字典嵌套及操作
av_catalog = { "歐美":{ "www.youporn.com": ["很多免費的,世界最大的","質量一般"], "www.pornhub.com": ["很多免費的,也很大","質量比yourporn高點"], "letmedothistoyou.com": ["多是自拍,高質量圖片很多","資源不多,更新慢"], "x-art.com":["質量很高,真的很高","全部收費,屌比請繞過"] }, "日韓":{ "tokyo-hot":["質量怎樣不清楚,個人已經不喜歡日韓範了","聽說是收費的"] }, "大陸":{ "1024":["全部免費,真好,好人一生平安","服務器在國外,慢"] } } av_catalog["大陸"]["1024"][1] += ",可以用爬蟲爬下來"print(av_catalog["大陸"]["1024"])#ouput ['全部免費,真好,好人一生平安', '服務器在國外,慢,可以用爬蟲爬下來']
7.7其它姿勢
#values>>> info.values() dict_values(['LongZe Luola', 'XiaoZe Maliya'])#keys >>> info.keys() dict_keys(['stu1102', 'stu1103'])#setdefault >>> info.setdefault("stu1106","Alex")'Alex' >>> info {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} >>> info.setdefault("stu1102","龍澤蘿拉")'LongZe Luola' >>> info {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'}#update >>> info {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} >>> b = {1:2,3:4, "stu1102":"龍澤蘿拉"} >>> info.update(b) >>> info {'stu1102': '龍澤蘿拉', 1: 2, 3: 4, 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'}#itemsinfo.items() dict_items([('stu1102', '龍澤蘿拉'), (1, 2), (3, 4), ('stu1103', 'XiaoZe Maliya'), ('stu1106', 'Alex')])#通過一個列表生成默認dict,有個沒辦法解釋的坑,少用吧這個 >>> dict.fromkeys([1,2,3],'testd') {1: 'testd', 2: 'testd', 3: 'testd'}
7.8循環dict
#方法1 for key in info: print(key,info[key]) #方法2 for k,v in info.items(): #會先把dict轉成list,數據裏大時莫用 print(k,v)
8.程序練習
程序: 三級菜單
要求:
打印省、市、縣三級菜單
可返回上一級
可隨時退出程序
注:
range(1,10,2) #循環裏按照步長打印 ,打印1到10,步長是2
特別鳴謝:Alex,徐亮偉的微博