[TOC]
# Python 簡介
---
* **Python 是一種解釋型語言:** 這意味著開發過程中沒有了編譯這個環節。
* **Python 是交互式語言:** 這意味著,您可以在一個 Python 提示符 \>>> 后直接執行代碼。
* **Python 是面向對象語言:** 這意味著 Python 支持面向對象的風格或代碼封裝在對象的編程技術。
# 基礎語法
---
## 保留字
保留字即關鍵字,我們不能把它們用作任何標識符名稱。Python 的標準庫提供了一個 keyword 模塊,可以輸出當前版本的所有關鍵字:
```
import keyword
print(keyword.kwlist)
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue','def',
'del', 'elif', 'else', 'except','finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal',
'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
```
## 注釋
單行注釋以`#`開頭,多行注釋可以用多個`#`,也可以用`'''`或`"""`
```
# 第一個注釋
# 第二個注釋
'''
第三注釋
第四注釋
'''
"""
第五注釋
第六注釋
"""
```
## 行與縮進
python 最具特色的就是使用縮進來表示代碼塊,不需要使用大括號 {}。
縮進的空格數是可變的,但是同一個代碼塊的語句必須包含相同的縮進空格數。實例如下:
```
if True:
print('True')
else:
print('False')
```
## 多行語句
Python 通常是一行寫完一條語句,但如果語句很長,我們可以使用反斜杠(\\)來實現多行語句,例如:
```
total = item_one + \
item_two + \
item_three
```
在 \[\], {}, 或 () 中的多行語句,不需要使用反斜杠(\\),例如:
~~~
total = ['item_one', 'item_two', 'item_three',
'item_four', 'item_five']
~~~
## 數字(Number)類型
python 中數字有四種類型:整數、布爾型、浮點數和復數。
* **int**(整數), 如 1, 只有一種整數類型 int,表示為長整型,沒有 python2 中的 Long。
* **bool**(布爾), 如 True。
* **float**(浮點數), 如 1.23、3E-2
* **complex**(復數), 如 1 + 2j、 1.1 + 2.2j
## 字符串(String)
* Python 中單引號和雙引號使用完全相同。
* 使用三引號('''或""")可以指定一個多行字符串。
* 轉義符 '\\'
* 反斜杠可以用來轉義,使用 r 可以讓反斜杠不發生轉義。。 如 r"this is a line with \\n" 則 \\n 會顯示,并不是換行。
* 按字面意義級聯字符串,如 "this " "is " "string" 會被自動轉換為 this is string。
* 字符串可以用 + 運算符連接在一起,用 \* 運算符重復。
* Python 中的字符串有兩種索引方式,從左往右以 0 開始,從右往左以 -1 開始。
* Python中的字符串不能改變。
* Python 沒有單獨的字符類型,一個字符就是長度為 1 的字符串。
* 字符串的截取的語法格式如下:變量\[頭下標:尾下標:步長\]
~~~
str = 'Runoob'
print(str) # 輸出字符串
print(str[0:-1]) # 輸出第一個到倒數第二個的所有字符
print(str[0]) # 輸出第一個字符
print(str[2:5]) # 輸出第三個開始到第五個的字符
print(str[2:]) # 輸出第三個開始后的所有字符
print(str * 2) # 輸出字符串兩次
print(str + 'hello') # 連接字符
print('--------------------------')
print('hello\nrunoob') # 特殊字符 \n
print(r'hello\nrunoob') # 在字符串前添加一個 r,表示原始字符串,不會發生轉義
Runoob
Runoo
R
noo
noob
RunoobRunoob
Runoobhello
--------------------------
hello
runoob
hello\nrunoob
~~~
## import 與 from...import
- 在 python 用`import`或者`from...import`來導入相應的模塊。
- 將整個模塊(somemodule)導入,格式為:`import somemodule`
- 從某個模塊中導入某個函數,格式為:`from somemodule import somefunction`
- 從某個模塊中導入多個函數,格式為:`from somemodule import firstfunc, secondfunc, thirdfunc`
- 將某個模塊中的全部函數導入,格式為:`from somemodule import *`
~~~
# 導入 sys 模塊
import sys
print('========Python import mode==========')
print('命令行參數為:')
for i in sys.argv:
print(i)
print('\n python 路徑為', sys.path)
~~~
~~~
# 導入 sys 模塊的 argv,path 成員
from sys import argv,path
print('path:', path) # 因為已經導入 path 成員,所以此處引用時不需要加 sys.path
~~~
# ????
## Python 基礎
### 數據類型和變量
**變量的聲明與賦值**
Python 中的變量不需要聲明。每個變量在使用前都必須賦值,變量賦值以后該變量才會被創建。
在 Python 中,變量就是變量,它沒有類型,我們所說的"類型"是變量所指的內存中對象的類型。
Python 允許你同時為多個變量賦值。例如:
~~~
a = b = c = 1
~~~
以上實例,創建一個整型對象,值為 1,從后向前賦值,三個變量被賦予相同的數值。
你也可以為多個對象指定多個變量。例如:
~~~
a, b, c = 1, 2, "runoob"
~~~
以上實例,兩個整型對象 1 和 2 的分配給變量 a 和 b,字符串對象 "runoob" 分配給變量 c。
**標準數據類型**
Python3 中有六個標準的數據類型:
* Number(數字)
* String(字符串)
* List(列表)
* Tuple(元組)
* Set(集合)
* Dictionary(字典)
內置的 type() 函數和 instance() 函數可以用來查詢變量所指的對象類型。
~~~
a, b, c, d = 20, 5.5, True, 4 + 3j
print(type(a), type(b), type(c), type(d))
print(isinstance(a, int))
// output
<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>
True
~~~
下面依次對這其進行介紹。
#### Number(數字)
*****
Python3 支持 **int、float、bool、complex(復數)**
在Python3 里,只有一種整數類型 int,表示為長整型,沒有 python2 中的 Long。
~~~
a, b, c, d = 20, 5.5, True, 4 + 3j
print(type(a), type(b), type(c), type(d))
// output
<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>
~~~
數值運算:
~~~
>>>5 + 4 # 加法
9
>>> 4.3 - 2 # 減法
2.3
>>> 3 * 7 # 乘法
21
>>> 2 / 4 # 除法,得到一個浮點數
0.5
>>> 2 // 4 # 除法,得到一個整數
0
>>> 17 % 3 # 取余
2
>>> 2 ** 5 # 乘方
32
~~~
#### 字符串(String)
*****
* Python 中單引號和雙引號使用完全相同。
* 使用三引號('''或""")可以指定一個多行字符串。
* 轉義符 '\\'
* 反斜杠可以用來轉義,使用 r 可以讓反斜杠不發生轉義。。 如 r"this is a line with \\n" 則 \\n 會顯示,并不是換行。
* 按字面意義級聯字符串,如 "this " "is " "string" 會被自動轉換為 this is string。
* 字符串可以用 + 運算符連接在一起,用 \* 運算符重復。
* Python 中的字符串有兩種索引方式,從左往右以 0 開始,從右往左以 -1 開始。
* Python中的字符串不能改變。
* Python 沒有單獨的字符類型,一個字符就是長度為 1 的字符串。
* 字符串的截取的語法格式如下:變量\[頭下標:尾下標:步長\]
~~~
str = 'Runoob'
print(str) # 輸出字符串
print(str[0:-1]) # 輸出第一個到倒數第二個的所有字符
print(str[0]) # 輸出第一個字符
print(str[2:5]) # 輸出第三個開始到第五個的字符
print(str[2:]) # 輸出第三個開始后的所有字符
print(str * 2) # 輸出字符串兩次
print(str + 'hello') # 連接字符
print('--------------------------')
print('hello\nrunoob') # 特殊字符 \n
print(r'hello\nrunoob') # 在字符串前添加一個 r,表示原始字符串,不會發生轉義
Runoob
Runoo
R
noo
noob
RunoobRunoob
Runoobhello
--------------------------
hello
runoob
hello\nrunoob
~~~
#### List(列表)
- List(列表) 是 Python 中使用最頻繁的數據類型。
- 列表可以完成大多數集合類的數據結構實現。列表中元素的類型可以不相同,它支持數字,字符串甚至可以包含列表(所謂嵌套)。
- 列表是寫在方括號 \[\] 之間、用逗號分隔開的元素列表。
- 和字符串一樣,列表同樣可以被索引和截取,列表被截取后返回一個包含所需元素的新列表。
列表截取的語法格式如下:
~~~
變量[頭下標:尾下標]
~~~

加號`+`是列表連接運算符,星號`*`是重復操作。如下實例:
~~~
list = ['abcd', 786, 2.23, 'runoob', 70.2]
tinylist = [123, 'runoob']
print(list) # 輸出完整列表
print(list[0]) # 輸出列表第一個元素
print(list[1:3]) # 從第二個開始輸出到第三個元素
print(list[2:]) # 輸出從第三個元素開始的所有元素
print(tinylist * 2) # 輸出兩次列表
print(list + tinylist) # 連接列表
~~~
以上實例輸出結果為:
~~~
'abcd', 786, 2.23, 'runoob', 70.2]
abcd
[786, 2.23]
[2.23, 'runoob', 70.2]
[123, 'runoob', 123, 'runoob']
['abcd', 786, 2.23, 'runoob', 70.2, 123, 'runoob']
~~~
Python 列表截取可以接收第三個參數,參數作用是截取的步長,以下實例在索引 1 到索引 4 的位置并設置為步長為 2(間隔一個位置)來截取字符串:

#### Tuple(元組)
*****
元組(tuple)與列表類似,不同之處在于元組的元素不能修改。元組寫在小括號 () 里,元素之間用逗號隔開。
元組中的元素類型也可以不相同:
~~~
tuple = ('abcd', 786, 2.23, 'runoob', 70.2)
tinytuple = (123, 'runoob')
print(tuple) # 輸出完整元組
print(tuple[0]) # 輸出元組的第一個元素
print(tuple[1:3]) # 輸出從第二個元素開始到第三個元素
print(tuple[2:]) # 輸出從第三個元素開始的所有元素
print(tinytuple * 2) # 輸出兩次元組
print(tuple + tinytuple) # 連接元組
~~~
以上實例輸出結果如下:
~~~
('abcd', 786, 2.23, 'runoob', 70.2)
abcd
(786, 2.23)
(2.23, 'runoob', 70.2)
(123, 'runoob', 123, 'runoob')
('abcd', 786, 2.23, 'runoob', 70.2, 123, 'runoob')
~~~
#### Set(集合)
集合的基本功能是進行成員關系測試和刪除重復元素。
可以使用大括號`{ }`或者`set()`函數創建集合,注意:創建一個空集合必須用`set()`而不是`{ }`,因為`{ }`是用來創建一個空字典。
~~~
# 成員測試
if 'Rose' in student:
print('Rose 在集合中')
else:
print('Rose 不在集合中')
# set可以進行集合運算
a = set('abracadabra')
b = set('alacazam')
print(a)
print(a - b) # a 和 b 的差集
print(a | b) # a 和 b 的并集
print(a & b) # a 和 b 的交集
print(a ^ b) # a 和 b 中不同時存在的元素
~~~
以上實例輸出結果如下:
~~~
{'Mary', 'Jim', 'Rose', 'Jack', 'Tom'}
Rose 在集合中
{'b', 'a', 'c', 'r', 'd'}
{'b', 'd', 'r'}
{'l', 'r', 'a', 'c', 'z', 'm', 'b', 'd'}
{'a', 'c'}
{'l', 'r', 'z', 'm', 'b', 'd'}
~~~
#### Dictionary(字典)
*****
列表是有序的對象集合,字典是無序的對象集合。兩者之間的區別在于:字典當中的元素是通過鍵來存取的,而不是通過偏移存取。
字典是一種映射類型,字典用{ }標識,它是一個無序的 **鍵(key) : 值(value)** 的集合。
鍵(key) 必須使用不可變類型,Python3 的六個標準數據類型中:
* 不可變數據(3 個):Number(數字)、String(字符串)、Tuple(元組);
* 可變數據(3 個):List(列表)、Dictionary(字典)、Set(集合)。
在同一個字典中,鍵(key)必須是唯一的。
~~~
dict = {}
dict['one'] = "1 - 菜鳥教程"
dict[2] = "2 - 菜鳥工具"
tinydict = {'name': 'runoob', 'code': 1, 'site': 'www.runoob.com'}
print(dict['one']) # 輸出鍵為 'one' 的值: 1 - 菜鳥教程
print(dict[2]) # 輸出鍵為 2 的 值: 2 - 菜鳥工具
print(tinydict) # 輸出完整的字典: {'name': 'runoob', 'code': 1, 'site': 'www.runoob.com'}
print(tinydict.keys()) # 輸出所有的鍵: dict_keys(['name', 'code', 'site'])
print(tinydict.values()) # 輸出所有的值: dict_values(['runoob', 1, 'www.runoob.com'])
~~~
## 條件語句和循環語句
### 條件語句
Python 中條件語句的一般格式如下:
~~~
if condition_1:
statement_block_1
elif condition_2:
statement_block_2
else:
statement_block_3
~~~
注意:
* 1、每個條件后面要使用冒號:,表示接下來是滿足條件后要執行的語句塊。
* 2、使用縮進來劃分語句塊,相同縮進數的語句在一起組成一個語句塊。
* 3、在Python中沒有switch – case語句。
### 循環語句
Python 中的循環語句有 for 和 while。
以下實例使用了 while 來計算 1 到 100 的總和:
~~~
n = 100
sum = 0
counter = 1
while counter <= n:
sum = sum + counter
counter += 1
print("1 到 %d 之和為: %d" % (n, sum))
~~~
在 while … else 在條件語句為 false 時執行 else 的語句塊。
實例如下:
~~~
count = 0
while count < 5:
print (count, " 小于 5")
count = count + 1
else:
print (count, " 大于或等于 5")
~~~
**for 語句**
Python for循環可以遍歷任何序列的項目,如一個列表或者一個字符串。
實例如下:
~~~
languages = ['C', 'C++', 'Perl', 'Python']
for x in languages:
print(x)
C
C++
Perl
Python
~~~
**range() 函數**
如果你需要遍歷數字序列,可以使用內置range()函數。它會生成數列,例如:
~~~
for i in range(5):
print(i)
'''
0
1
2
3
4
'''
~~~
也可以使用 range 指定區間的值
~~~
for i in range(5, 9):
print(i)
'''
5
6
7
8
~~~
也可以使 range 以指定數字開始并指定不同的增量
~~~
for i in range(0, 10, 3):
print(i)
'''
0
3
6
9
'''
~~~
負數
~~~
for i in range(-10, -100, -30):
print(i)
'''
-10
-40
-70
'''
~~~
結合 range() 和 len() 函數以遍歷一個序列的索引,如下所示:
~~~
a = ['Google', 'Baidu', 'Taobao', 'QQ']
for i in range(len(a)):
print(i, a[i])
'''
0 Google
1 Baidu
2 Taobao
3 QQ
'''
~~~
## 迭代器和生成器
## 函數
1、定義函數
使用`def`語句定義函數:
~~~
def my_abs(x):
if x >= 0:
return x
else:
return -x
print(my_abs(-99))
~~~
如果沒有`return`語句,函數執行完畢后也會返回結果,只是結果為`None`。`return None`可以簡寫為`return`。
<span style="font-size: 18px;">返回多個值<span>
~~~
import math
def move (x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
x, y = move(100, 100, 60, math.pi / 6)
print(x, y)
151.96152422706632 70.0
# 返回多個值只是一種假象,返回值是一個 tuple
r = move(100, 100, 60, math.pi / 6)
print(r)
(151.96152422706632, 70.0)
~~~
2、調用函數
3、函數的參數
4、遞歸函數