1. 程式人生 > >Python基礎入門總結

Python基礎入門總結

Python基礎入門教學

  • 基礎中的基礎
  • 列表、元組(tuple)、字典、字串
  • 變數和引用
  • 函式
  • python視訊教程下載

基礎中的基礎

  • 解釋型語言和編譯型語言差距;

 

Python概述

 

直譯器執行原理

 

 

which python3可以檢視python3的位置(linux下);


互動式環境中使用exit()或者ctrl+D退出;


9 // 2表示取結果的整數,乘方使用**;


乘法可以用在 字串中 也就是說 "_ " * 5 會輸出5個 “_”;


資料型別分為 數字型和非數字型: (1)數字型 : 整形、浮點型、布林型、複數型。(2)非數字型: 字串、列表、元組、字典。type(變數名)檢視變數型別;
python3中沒有long,只有int;


變數的輸入: input()函式。注意: input()函式輸入的資料型別都是字串型別;


在python中,如果變數名需要兩個或多個單片語成時,可以按照下面的方式: ①每個單詞都是小寫;②單詞和單詞之間使用_下劃線連線;③使用駝峰規則;


print函式如果不想輸出換行,在後面加上一個end=""(例如print(“a”,end=""));單純的只想輸出一個換行可以使用print()或者print("");
\t(製表符(對齊))和\n轉義字元;

關於函式的註釋,寫在函式的下面,加上三個"""。以及文件註釋,例如:

1 def sum_2_sum(a, b):
2     """計算a和b的和
3     :param a:第一個引數
4     :param b:第二個引數
5     :return:
6     """
7     return a + b

因為函式體相對比較獨立,函式定義的上方,應該和其他程式碼(包括註釋)保留兩個空行;
import匯入的檔案可以python直譯器將模組解釋成一個pyc二進位制檔案(類似Java的.class?);
python中關鍵字後面不需要加括號(如del 關鍵字);
方法和函式的異同: ①方法和函式類似,同樣是封裝了獨立的功能;②方法需要通過物件來呼叫,表示針對這個物件要做的操作③函式需要記住,但是方法是物件的"函式",方法不需要記住(IDE提示或者IPython中TAB補全);
變數賦值的幾種特殊的方式:

 1 a = b = c = 1  # 三個都是1
 2 a, b, c = 1, 2, "hello"  # a = 1, b = 2, c = "hello"
 3 
 4 a, b = 0, 1
 5 a, b = b, a+b  # 右邊表示式的執行順序是從左往右的。
 6 """
 7 上面的程式碼類似: 
 8 n = b
 9 m = a+b
10 a = n
11 b = m
12 """
13 print(a)  # 1
14 print(b)  # 1
  • 邏輯運算子:and、or、not,成員運算子in、not in,身份運算子is、is not

列表、元組(tuple)、字典、集合、字串

  • 列表可以巢狀
1 x = [['a', 'b', 'c'], [1, 2, 3]]
2 print(x[0])  # ['a', 'b', 'c']
3 print(x[0][1])  # 'b'

元組不同於列表的是: 元組不能修改,用()表示;(不能增刪改)
元組一般儲存不同型別的資料;
注意: 只有一個元素的元組: single_tuple = (5,) ,也就是說元組中只包含一個元素時,需要在元素後面新增逗號;不能這樣寫 single_tuple = (5),這樣是一個整形的變數;另外,建立元組也可以不加上括號;

1 tup = "a", "b", "c", "d"
2 print(tup)
3 print(type(tup))
4 
5 tup2 = ("a",)  # 一個元素的元組 (後面必須加上一個括號)
6 print(tup2)
7 print(type(tup2))

輸出:

1 ('a', 'b', 'c', 'd')
2 <class 'tuple'>
3 ('a',)
4 <class 'tuple'>
  • 元組的用途: ① 作為函式的引數和返回值;②格式化字串(格式字串本身就是一個元組);(3)讓列表不可以被修改,保護資料安全;

 

  • 格式化字串和元組的關係,看下面的三個print輸出是一樣的:
1 # 元組和格式化字串的關係
2 info_tuple = ("小明", 21, 1.85)
3 print("%s 年齡是 %d 身高是 %.2f" % ("小明", 21, 1.85))
4 print("%s 年齡是 %d 身高是 %.2f" % info_tuple)
5 
6 info_str = "%s 年齡是 %d 身高是 %.2f" % info_tuple
7 print(info_str)
  • 元組和列表可以相互轉換 : ①使用list(元組)將元組轉換成列表;②使用tuple將列表轉換成元組;
  • 字典: ① 鍵必須是唯一的 ②值可以取任意型別,但是鍵只能使用字串、數字或者元組(鍵只能是不可變型別)。
  • **遍歷字典的時候for k in dict 中的k是鍵,而不是值。(普通的for),不過也可以通過items()方法遍歷鍵值對:
 1 dict_student = {'name': 'xiaoming', 'age': '18', 'qq': "1234"}
 2 
 3 # 遍歷方式一
 4 for k in dict_student:  # k 是key
 5     print(k, end=" ")
 6     print(dict_student[k])
 7 
 8 print("*" * 20)
 9 # 遍歷方式二
10 for k, v in dict_student.items():
11     print(k, v)

字串中的轉義字元:\n表示換行,而\r表示回車,字串中的函式isspace()判斷的時候\t\n\r都是表示的空白字元;
isdecimla()、isdigit()、isnumeric()都不能判斷字串中的小數,(可以判斷字串中的整數);
集合set的使用: 可以使用大括號 { } 或者 set() 函式建立集合,注意:建立一個空集合必須用 set() 而不是 { },因為 { } 是用來建立一個空字典。 集合還有一些方法add()、update()、pop()等;

 1 student = {'Tom', 'Jim', 'Mary', 'Tom', 'Jack', 'Rose'}
 2 print(student)  # 輸出集合,重複的元素被自動去掉
 3 
 4 if 'Rose' in student:
 5     print('Rose 在集合中')
 6 else:
 7     print('Rose 不在集合中')
 8 
 9 # set可以進行集合運算
10 a = set('abracadabra')
11 b = set('alacazam')
12 
13 print(a - b)  # a和b的差集
14 print(a | b)  # a和b的並集
15 print(a & b)  # a和b的交集
16 print(a ^ b)  # a和b中不同時存在的元素

輸出:

1 {'Jim', 'Mary', 'Jack', 'Rose', 'Tom'}
2 Rose 在集合中
3 {'b', 'd', 'r'}
4 {'b', 'l', 'c', 'd', 'z', 'm', 'a', 'r'}
5 {'c', 'a'}
6 {'b', 'm', 'l', 'r', 'd', 'z'}

相關公共方法: len、del、max、min(只會比較字典的key);
in、not in的使用(類似資料庫…);
pass關鍵字的使用: 比如if … 下面沒有寫語句,python會提示報錯,但是你可以寫一個pass就不會報錯了;也就是說如果在開發程式時,不希望立即編寫分支內部的程式碼,可以使用pass作為一個佔位符;可以保證程式程式碼結構正確;
TODO關鍵字的使用,在編寫程式框架的時候,可以用TODO標示某個地方還沒有做某事;
迭代器的使用

 1 import sys  # 引入 sys 模組
 2 
 3 lst = [1, 2, 3, 4]
 4 it = iter(lst)  # 建立迭代器物件
 5 
 6 # 使用for 遍歷迭代器
 7 for x in it:
 8     print(x, end=" ")
 9 print()
10 
11 it = iter(lst)  # 之前那個已經到了最後了,再次獲取
12 # 使用next + while遍歷
13 while True:
14     try:
15         print(next(it), end=" ")
16     except StopIteration:  # 防止無限迴圈
17         sys.exit()  # 退出程式
18 print()

輸出:

1 1 2 3 4 
2 1 2 3 4 

字串中切片的使用: ①類似擷取,但是可以指定步長;②python中支援倒序索引,最後一個是-1,倒數第二個是-2…;

 

 

 

 1 # 切片的使用
 2 num_str = "12345678"
 3 
 4 print(num_str[2:6])  # [2,5]
 5 print(num_str[2:])  # 從2位置到結束
 6 print(num_str[0:6])  # 輸出[0,5]的
 7 print(num_str[:6])  # 一開始到5的
 8 print(num_str[:])  # 全部輸出
 9 print(num_str[::2])  # 指定步長  第三個引數指定步長
10 print(num_str[1::2])  # 從第一個開始 步長為2
11 
12 print("*" * 20)
13 print(num_str[-1])  # 輸出最後一個位置的
14 print(num_str[2:-1])  # 從第二個開始到倒數第二個
15 
16 print("*" * 20)
17 # 一個面試題 逆序輸出
18 print(num_str[-1::-1])  # 步長為-1代表向左切片,從最後一個開始切
19 print(num_str[::-1])

輸出:

 1 3456
 2 345678
 3 123456
 4 123456
 5 12345678
 6 1357
 7 2468
 8 ********************
 9 8
10 34567
11 ********************
12 87654321
13 87654321

變數和引用

變數和資料都是儲存在記憶體中的;
在python中函式的引數傳遞以及返回值都是引用傳遞的;
變數和資料是分開儲存的;
變數中記錄資料的地址,就叫做引用;
使用id()函式可以檢視變數中儲存的資料所在的記憶體地址;
注意: 如果變數已經被定義,當給一個變數複製的時候,本質上是修改了資料的引用。① 變數不再對之前的資料引用;②變數改為對新複製的資料引用;
可變型別和不可變型別

不可變型別: 記憶體中的資料不允許修改:

① 數字型別: int、bool、 float、complex、long
② 字串 :str
③ 元組 :tuple

可變型別: 記憶體中的資料可以被修改

① 列表 list
② 字典 dict
可變型別:變數賦值 a=5 後再賦值 a=10,這裡實際是新生成一個 int 值物件 10,再讓 a 指向它,而 5 被丟棄,不是改變a的值,相當於新生成了a;
不可變型別: 變數賦值 la=[1,2,3,4] 後再賦值 la[2]=5 則是將 list la 的第三個元素值更改,本身la沒有動,只是其內部的一部分值被修改了。

函式引數傳遞時注意:

不可變型別:類似 c++ 的值傳遞,如 整數、字串、元組。如fun(a),傳遞的只是a的值,沒有影響a物件本身。比如在 fun(a)內部修改 a 的值,只是修改另一個複製的物件,不會影響 a 本身。
可變型別:類似 c++ 的引用傳遞,如 列表,字典。如 fun(la),則是將 la 真正的傳過去,修改後fun外部的la也會受影響;
  • 區域性變數和全域性變數
區域性變數:函式內部定義的變數,只能在函式內部使用;
全域性變數: 函式外部定義的變數,所有函式內部都可以使用這個變數;(不推薦使用)

  注意: 在python中,不允許修改全域性變數的值,如果修改,會在函式中定義一個區域性變數;

 1 num = 10
 2 
 3 
 4 # python中,不允許修改全域性變數
 5 
 6 def method1():
 7     num = 99  # 這裡沒有修改全域性變數num,而是自己又定義了一個區域性變數,執行完這個函式,區域性變數就會回收
 8     print(num)
 9 
10 
11 def method2():
12     print(num)  # 雖然在method1中修改了 num 但是卻不會修改
13 
14 
15 method1()
16 method2()
17 
18 # 輸出
19 # 99
20 # 10
  • 可以使用global關鍵字修改全域性變數的值。
  • 全域性變數的命名規則: 前面加上g_ 或者gl_
  • 函式

    • 函式如果返回的是一個元組就可以省略括號;
    • 如果返回的是一個元組,可以使用多個變數直接接收函式的返回結果;(注意變數的個數和返回的元組的個數相同)

    例如:

 1 ef measure():
 2     """測量溼度和溫度"""
 3     temp = 39
 4     wetness = 50
 5 
 6     # 下面返回的是一個元組,為什麼寫成沒有括號的樣子,因為如果返回的是一個元組就可以省略括號
 7     # return (temp, wetness)
 8     return temp, wetness
 9 
10 
11 res = measure()
12 print(res)
13 print(type(res))  # tuple
14 
15 
16 # 很騷的,直接使用多個變數接收函式返回的元組
17 gl_temp, gl_wetness = measure()
18 print(gl_temp)
19 print(gl_wetness)
  • 交換兩個變數a、b的值的三種解法(第三種python專用)
 1 a = 6
 2 b = 100
 3 
 4 # 解法1
 5 c = a
 6 a = b
 7 b = c
 8 print(a)
 9 print(b)
10 
11 # 解法2
12 
13 a = a + b
14 b = a - b
15 a = a - b
16 print(a)
17 print(b)
18 
19 # 解法3 python專用
20 # a, b = (b, a)
21 a, b = b, a
22 print(a)
23 print(b)
  • 如果在函式中使用賦值語句,並不會影響呼叫函式時傳遞的實參變數;無論傳遞的引數可變還是不可變;
  • 只要針對引數使用賦值語句,會在函式內部修改區域性變數的引用,不會影響到外部變數的引用;

測試:

 1 def demo(num, num_list):
 2     print("函式內部的程式碼")
 3 
 4     num = 100
 5     num_list = [1, 2, 3]
 6 
 7     print(num)
 8     print(num_list)
 9     print("函式執行完成")
10 
11 
12 gl_num = 99
13 gl_list = [4, 5, 6]
14 demo(gl_num, gl_list)
15 print(gl_num)  # 99
16 print(gl_list)  # [4, 5, 6]

輸出:

1 函式內部的程式碼
2 100
3 [1, 2, 3]
4 函式執行完成
5 99
6 [4, 5, 6]

一張圖解釋:

  • 如果傳遞的引數是可變型別,在函式內部,使用方法修改了資料的內容,同樣會影響到外部的資料。
 1 def demo(num_list):
 2     print("函式內部的程式碼")
 3     num_list.append(666)
 4     print(num_list)
 5     print("函式程式碼執行結束")
 6 
 7 
 8 gl_list = [1, 2, 3]
 9 demo(gl_list)
10 print(gl_list)

輸出:

1 函式內部的程式碼
2 [1, 2, 3, 666]
3 函式程式碼執行結束
4 [1, 2, 3, 666]

示意圖:

 

 

 上面寫了,這裡再重複一遍可變型別和不可變型別和引數傳遞的關係:

不可變型別:類似 c++ 的值傳遞,如 整數、字串、元組。如fun(a),傳遞的只是a的值,沒有影響a物件本身。比如在 fun(a)內部修改 a 的值,只是修改另一個複製的物件,不會影響 a 本身。
可變型別:類似 c++ 的引用傳遞,如 列表,字典。如 fun(la),則是將 la 真正的傳過去,修改後fun外部的la也會受影響;
  • 列表變數呼叫 += 的時候相當於是呼叫extend,這個是一個特列;
 1 def demo(num, num_list):
 2     print("函式開始")
 3 
 4     # 賦值語句 不會改變外部
 5     num += num
 6 
 7     # 但是列表是一個特例,+=列表相當於 extend 所以會改變外部
 8     num_list += num_list
 9     # num_list = num_list + num_list  # 這樣就不會改變實參
10 
11     print(num)
12     print(num_list)
13 
14     print("函式結束")
15 
16 gl_num = 9
17 gl_list = [1, 2, 3]
18 
19 demo(gl_num, gl_list)
20 
21 print(gl_num)
22 print(gl_list)

輸出:

1 函式開始
2 18
3 [1, 2, 3, 1, 2, 3]
4 函式結束
5 9
6 [1, 2, 3, 1, 2, 3]
  • 預設引數: ①定義函式時,可以給某個引數指定一個預設值,指定了預設值的引數叫做預設引數;②一般使用最常見的值作為預設引數;③預設引數的定義位置:必須保證帶有預設值的預設引數定義在引數列表的末尾;

 

1 def print_info(name, gender=True):
2     gender_text = "男生"
3     if not gender:
4         gender_text = "女生"
5     print("%s 是 %s" % (name, gender_text))
6 
7 print_info("小明")  # 預設引數 使用最常見的值,作為預設引數
8 print_info("小美", False)

 

還要注意,如果後面有多個引數,且只給具體的某一個指定預設值,就要具體的指定引數的名字:

1 def print_info(name, title="", gender=True):
2     gender_text = "男生"
3     if not gender:
4         gender_text = "女生"
5     print("%s 是 %s" % (name, gender_text))
6 
7 print_info("小明") 
8 print_info("小美", False)  # 這個是錯誤的
9 print_info("小美", gender=False)  # 這裡必須指定為gender

輸出:

 

 

 

 這個原理類似降序排序:

 

 

1 gl_list = [6, 3, 9]
2 gl_list.sort(reverse=True)
3 print(gl_list)

 

多值引數

 

1 def demo(num, *args, **kwargs):  # 多值引數 *接收元組 **接收字典
2     print(num)
3     print(args)
4     print(kwargs)

輸出:

1 1
2 (2, 3, 4, 5)
3 {'name': '小明', 'age': 18}

使用多值引數的好處,例如下面的例子計算求和,如果不使用* args 也就是不使用多值的元組的時候,我們傳遞引數的時候就需要傳遞一個元組,但是這樣的話就直接傳遞一串數字就好了。

1 def sum_number(*args):
2     res = 0
3     for n in args:
4         res += n
5     return res
6 
7 
8 print(sum_number(1, 2, 3, 4, 5))
9 # print(sum_number((1, 2, 3, 4, 5)))  # 如果不加上*的話就要加上這個表示元組的括號

多值引數元組和字典的拆包

 

 

 首先看下面程式碼的輸出,這個程式碼是出乎意料的:

1 def demo(*args, **kwargs):
2     print(args)
3     print(kwargs)
4 
5 
6 gl_tuple = (1, 2, 3)
7 gl_dict = {"name": "小明", "age": 18}
8 
9 demo(gl_tuple, gl_dict)

輸出:

1 ((1, 2, 3), {'name': '小明', 'age': 18})
2 {}

加上拆包:

1 def demo(*args, **kwargs):
2     print(args)
3     print(kwargs)
4 
5 
6 gl_tuple = (1, 2, 3)
7 gl_dict = {"name": "小明", "age": 18}
8 
9 demo(*gl_tuple, **gl_dict)  # 注意這裡加上了拆包 類似與之前的傳遞引數

輸出:

1 (1, 2, 3)
2 {'name': '小明', 'age': 18

&n