Python基礎
1、Python模塊
### sys模塊
#!/usr/bin/python
# _*_ coding:utf-8 _*_
# Aothr: Kim
import sys #導入sys模塊
print (sys.path) #打印python環境變量
print(sys.argv) #打印腳本相對路徑,執行的時候可以傳入參數
print (sys.argv[2]) #取出傳入的參數
###os模塊
import os
print(os.system("dir")) #調用系統命令
cmd_res = os.popen("dir").read() #使用cmd_res變量存儲執行結果,這裏命令的執行結果會指向一個內存地址,所以需要加.read去讀取結果。
print("-->",cmd_res)
os.mkdir("new_dir") #os模塊中的創建目錄方法
第三方庫,默認找當前目錄,然後找Python環境變量是否存在該模塊名。
2、Python PYC
預編譯後的字節碼
(1)Python是一門解釋型語言?
初學Python一直聽別人說,Python是一門解釋性語言,直到發現了.pyc文件的存在。如果是解釋型語言,那麼生成的.pyc文件是什麼呢?c應該是compiled的縮寫纔對啊!
爲了防止其他學習Python的人也被這句話誤解,那麼我們就在文中來澄清下這個問題,並且把一些基礎概念給理清。
(2)解釋型語言和編譯型語言
計算機是不能夠識別高級語言的,所以當我們運行一個高級語言程序的時候,就需要一個“翻譯機”來從事把高級語言轉變成計算機能讀懂的機器語言的過程。這個過程分成兩類,第一種是編譯,第二種是解釋。
編譯型語言在程序執行之前,先會通過編譯器對程序執行一個編譯的過程,把程序轉變成機器語言。運行時就不需要翻譯,而直接執行就可以了。最典型的例子就是C語言。
解釋型語言就沒有這個編譯的過程,而是在程序運行的時候,通過解釋器對程序逐行作出解釋,然後直接運行,最典型的例子是Ruby。
通過以上的例子,我們可以來總結一下解釋型語言和編譯型語言的優缺點,因爲編譯型語言在程序運行之前就已經對程序做出了“翻譯”,所以在運行時就少掉了“翻譯”的過程,所以效率比較高。但是我們也不能一概而論,一些解釋型語言也可以通過解釋器的優化來在對程序做出翻譯時對整個程序做出優化,從而在效率上超過編譯型語言。
此外,隨着Java等基於虛擬機的語言的興起,我們又不能把語言純粹地分成解釋型和編譯型這兩種。
用Java來舉例,Java首先是通過編譯器編譯成字節碼文件,然後在運行時通過解釋器給解釋成機器文件。所以我們說Java是一種先編譯後解釋的語言。
(3)Python到底是什麼
Python也是一門基於虛擬機的語言,我們先來從表面上簡單地瞭解一下Python程序的運行過程吧。
當我們在命令行中輸入python hello.py時,其實是激活了Python的“解釋器”,告訴“解釋器”:你要開始工作了。可是在“解釋”之前,其實執行的第一項工作和Java一樣,是編譯。
Python是一門先編譯後解釋的語言。
(4)簡述Python的運行過程
在說這個問題之前,我們先來說兩個概念,PyCodeObject和pyc文件。
我們在硬盤上看到的pyc自然不必多說,而其實PyCodeObject則是Python編譯器真正編譯成的結果。我們先簡單知道就可以了,繼續向下看。
當python程序運行時,編譯的結果則是保存在位於內存中的PyCodeObject中,當Python程序運行結束時,Python解釋器則將PyCodeObject寫回到pyc文件中。
當python程序第二次運行時,首先程序會在硬盤中尋找pyc文件,如果找到則直接載入,否則就重複上面的過程。
所以我們應該這樣來定位PyCodeObject和pyc文件,我們說pyc文件其實是PyCodeObject的一種持久化保存方式。
3、Python數據類型
3.1、int(整數)
在32位機器上,整數的位數爲32位,取值範圍爲-2**31~2**31-1,即-2147483648~2147483647
在64位系統上,整數的位數爲64位,取值範圍爲-2**63~2**63-1,即-9223372036854775808~9223372036854775807
3.2、long(長整數)
自從python2.2起,如果整數發生溢出,python會自動將整數數據轉爲長整數類型,但是在python3.x版本,不存在long數據類型
========python 2.7.5===========
[root@python ~]# python
Python 2.7.5 (default, Aug 4 2017, 00:39:18)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> type(2**50)
<type 'int'>
>>> type(2**60)
<type 'int'>
>>> type(2**62)
<type 'int'>
>>> type(2**63)
<type 'long'>
>>>
========python 3.5.2===========
(venv) D:\Python18\day02>python
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> type(2**100)
<class 'int'>
3.3、float(浮點數)
1.浮點數用來處理實數,即帶有小數的數字。
2.浮點表示的形式是小數,但小數不一定都是浮點型,23和52.3E-4是浮點數的例子。E標記表示10的冪。在這裏,52.3E-4表示52.3 * 10-4。
3.4、complex(複數)
複數由實數部分和虛數部分組成,一般形式爲x+yj,其中的x是複數的實數部分,y是複數的虛數部分,這裏的x和y都是實數。
注:Python中存在小數字池:-5 ~ 257
3.5、布爾值
真或假、1或0
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
3.6、查看數據類型的方法
查看數據類型,使用type(),如下:
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print(type("www.123.com"))
<class 'str'> #字符串
>>> print(type(1.22))
<class 'float'> #浮點數
>>> print(type(1))
<class 'int'> #整型
4、數據運算
4.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 |
4.2比較運算
操作符 | 描述符 | 示例 |
---|---|---|
== | 檢查,兩個操作數的值是否相等,如果是則條件變爲真。 | (a == b) 不爲 true. |
!= | 檢查兩個操作數的值是否相等,如果值不相等,則條件變爲真。 | (a != b) 爲 true. |
<> | 檢查兩個操作數的值是否相等,如果值不相等,則條件變爲真。 | (a <> b) 爲 true。這個類似於 != 運算符 |
> | 檢查左操作數的值是否大於右操作數的值,如果是,則條件成立。 | (a > b) 不爲 true. |
< | 檢查左操作數的值是否小於右操作數的值,如果是,則條件成立。 | (a < b) 爲 true. |
>= | 檢查左操作數的值是否大於或等於右操作數的值,如果是,則條件成立。 | (a >= b) 不爲 true. |
<= | 檢查左操作數的值是否小於或等於右操作數的值,如果是,則條件成立。 | (a <= b) 爲 true. |
4.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 |
4.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 |
4.5邏輯運算
操作符 | 描述符 | 示例 |
---|---|---|
and | 所謂邏輯與運算符。如果兩個操作數都是真的,那麼則條件成立。 | (a and b) 爲 true. |
or | 所謂邏輯OR運算符。如果有兩個操作數都是非零然後再條件變爲真。 | (a or b) 爲 true. |
not | 所謂邏輯非運算符。用於反轉操作數的邏輯狀態。如果一個條件爲真,則邏輯非運算符將返回false。 | not(a and b) 爲 false. |
4.6二、三元運算
result = 值1 if條件 else 值2
如果條件爲真:result=值1
如果條件爲假:result=值2
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32
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
4.7進制類型
二進制,01
八進制,01234567
十進制,0123456789
十六進制,0123456789ABCDEF
5、bytes類型
Python 3最重要的新特性大概要算是對文本和二進制數據作了更爲清晰的區分。文本總是Unicode,由str類型表示,二進制數據則由bytes類型表示。Python 3不會以任意隱式的方式混用str和bytes,正是這使得兩者的區分特別清晰。你不能拼接字符串和字節包,也無法在字節包裏搜索字符串(反之亦然),也不能將字符串傳入參數爲字節包的函數(反之亦然)。這是件好事。不管怎樣,字符串和字節包之間的界線是必然的,下面的圖解非常重要,務請牢記於心:
#!/usr/bin/python
# _*_ coding:utf-8 _*_
# Aothr: Kim
#string和bytes類型轉換,使用encode和decode的方式
#decode==>bytes-->string
#encode==>string-->bytes
#舉例
msg = "我愛北京天安門"
print(msg)
print(msg.encode(encoding="utf-8") #轉換成bytes
print(msg.encode(encoding="utf-8").decode(encoding="utf-8")) #轉換成字符串
執行結果如下:
我愛北京天安門
b'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8'
我愛北京天安門
應用場景:socket中傳輸必須是二進制,此時就需要將string進行轉換成bytes類型