python是一門(mén)解釋型語(yǔ)言
控制臺(tái)輸出語(yǔ)句
print("hello python")$ sudo apt install ipython 安裝比較好用的python命令行工具
Python 的 IDE —— PyCharm
注釋
# 這是第一個(gè)單行注釋 """ 這是一個(gè)多行注釋 在多行注釋之間,可以寫(xiě)很多很多的內(nèi)容…… """-
特殊算數(shù)運(yùn)算符
// 取整除 返回除法的整數(shù)部分(商) 9 // 2 輸出結(jié)果 4 ** 冪 又稱次方、乘方,2 ** 3 = 8 -
*運(yùn)算符還可以用于字符串,計(jì)算結(jié)果就是字符串重復(fù)指定次數(shù)的結(jié)果In [1]: "-" * 50 Out[1]: '----------------------------------------'數(shù)字型變量 和 字符串 之間 不能進(jìn)行其他計(jì)算
type(x) 查看 x 的變量類型
-
鍵盤(pán)輸入
字符串變量 = input("提示信息:") -
格式化字符
print("我的名字叫 %s,請(qǐng)多多關(guān)照!" % name) print("我的學(xué)號(hào)是 %06d" % student_no) # 000001 print("蘋(píng)果單價(jià) %.02f 元/斤,購(gòu)買(mǎi) %.02f 斤,需要支付 %.02f 元" % (price, weight, money)) print("數(shù)據(jù)比例是 %.02f%%" % (scale * 100)) -
if else
if 條件1: …… elif 條件2: …… else: …… -
and or not
條件1 and 條件2 條件1 or 條件2 not 條件 -
定義函數(shù)的格式如下
def 函數(shù)名(): 函數(shù)封裝的代碼 …… -
pyc文件
c是compiled的意思
瀏覽程序目錄會(huì)發(fā)現(xiàn)一個(gè) pycache 的目錄
目錄下會(huì)有類似 xxx.cpython-35.pyc 的文件,cpython-35 表示 Python 解釋器的版本
這個(gè) pyc 文件是由 Python 解釋器將 模塊的源碼 轉(zhuǎn)換為 字節(jié)碼
Python 這樣保存 字節(jié)碼 是作為一種啟動(dòng) 速度的優(yōu)化
-
Python在解釋源程序時(shí)是分成兩個(gè)步驟的- 首先處理源代碼,編譯 生成一個(gè)二進(jìn)制 字節(jié)碼
- 再對(duì) 字節(jié)碼 進(jìn)行處理,才會(huì)生成 CPU 能夠識(shí)別的 機(jī)器碼
- 有了模塊的字節(jié)碼文件之后,下一次運(yùn)行程序時(shí),如果在 上次保存字節(jié)碼之后 沒(méi)有修改過(guò)源代碼,Python 將會(huì)加載 .pyc 文件并跳過(guò)編譯這個(gè)步驟
- 當(dāng)
Python重編譯時(shí),它會(huì)自動(dòng)檢查源文件和字節(jié)碼文件的時(shí)間戳 - 如果你又修改了源代碼,下次程序運(yùn)行時(shí),字節(jié)碼將自動(dòng)重新創(chuàng)建
-
在 Python 中,所有 非數(shù)字型變量 都支持以下特點(diǎn):
- 都是一個(gè) 序列
sequence,也可以理解為 容器 - 取值
[] - 遍歷
for in - 計(jì)算長(zhǎng)度、最大 / 最小值、比較、刪除
- 鏈接
+和 重復(fù)* - 切片
- 都是一個(gè) 序列
-
列表 其他語(yǔ)言經(jīng)常叫數(shù)組
name_list = ["zhangsan", "lisi", "wangwu"] -
列表常用操作
序號(hào) 分類 關(guān)鍵字 / 函數(shù) / 方法 說(shuō)明 1 增加 列表.insert (索引,數(shù)據(jù)) 在指定位置插入數(shù)據(jù) 列表.append (數(shù)據(jù)) 在末尾追加數(shù)據(jù) 列表.extend (列表 2) 將列表 2 的數(shù)據(jù)追加到列表 2 修改 列表 [索引] = 數(shù)據(jù) 修改指定索引的數(shù)據(jù) 3 刪除 del 列表 [索引] 刪除指定索引的數(shù)據(jù) 列表.remove [數(shù)據(jù)] 刪除第一個(gè)出現(xiàn)的指定數(shù)據(jù) 列表.pop 刪除末尾數(shù)據(jù) 列表.pop (索引) 刪除指定索引數(shù)據(jù) 列表.clear 清空列表 4 統(tǒng)計(jì) len (列表) 列表長(zhǎng)度 列表.count (數(shù)據(jù)) 數(shù)據(jù)在列表中出現(xiàn)的次數(shù) 5 排序 列表.sort () 升序排序 列表.sort (reverse=True) 降序排序 列表.reverse () 逆序、反轉(zhuǎn) 【注】如果使用
del關(guān)鍵字將變量從內(nèi)存中刪除,后續(xù)的代碼就不能再使用這個(gè)變量了 -
Tuple(元組)與列表類似,不同之處在于元組的 元素不能修改info_tuple = ("zhangsan", 18, 1.75) # 元組中 只包含一個(gè)元素 時(shí),需要 在元素后面添加逗號(hào) info_tuple = (50, ) # 數(shù)據(jù)在元祖中出現(xiàn)的次數(shù) info_tuple.count(數(shù)據(jù)) # 數(shù)據(jù)第一次出現(xiàn)的索引 info_tuple.index(數(shù)據(jù)) -
元組和列表之間的轉(zhuǎn)換
list(元組) tuple(列表) -
字典
字典[key] key不存在會(huì)報(bào)錯(cuò) del 字典[key] key不存在會(huì)報(bào)錯(cuò) 字典.pop(key) key不存在會(huì)報(bào)錯(cuò) 字典.setdefault(key, value) key不存在添加key value,key存在不做操作 字典.clear 字典.items 所有(key,value)元組列表 字典.setdefault 字典.copy 字典.keys 字典.update(字典2) 字典2的數(shù)據(jù)合并到字典 字典.fromkeys 字典.pop 字典.values 字典.get 字典.popitem -
字符串截取(列表和元組同理)
num_str = "0123456789" # 1. 截取從 2 ~ 5 位置 的字符串 print(num_str[2:6]) # 2. 截取從 2 ~ `末尾` 的字符串 print(num_str[2:]) # 3. 截取從 `開(kāi)始` ~ 5 位置 的字符串 print(num_str[:6]) # 4. 截取完整的字符串 print(num_str[:]) # 5. 從開(kāi)始位置,每隔一個(gè)字符截取字符串 print(num_str[::2]) # 6. 從索引 1 開(kāi)始,每隔一個(gè)取一個(gè) print(num_str[1::2]) # 倒序切片 # -1 表示倒數(shù)第一個(gè)字符 print(num_str[-1]) # 7. 截取從 2 ~ `末尾 - 1` 的字符串 print(num_str[2:-1]) # 8. 截取字符串末尾兩個(gè)字符 print(num_str[-2:]) # 9. 字符串的逆序(面試題) print(num_str[::-1]) -
容器運(yùn)算符
運(yùn)算符 Python 表達(dá)式 結(jié)果 描述 支持的數(shù)據(jù)類型 + [1, 2] + [3, 4] [1, 2, 3, 4] 合并 字符串、列表、元組 * ["Hi!"] * 4 ['Hi!', 'Hi!', 'Hi!', 'Hi!'] 重復(fù) 字符串、列表、元組 in 3 in (1, 2, 3) True 元素是否存在 字符串、列表、元組、字典 not in 4 not in (1, 2, 3) True 元素是否不存在 字符串、列表、元組、字典 > >= == < <= (1, 2, 3) < (2, 2, 3) True 元素比較 字符串、列表、元組 -
for else語(yǔ)法對(duì),真是很費(fèi)解干什么用
for 變量 in 集合: 循環(huán)體代碼 else: 沒(méi)有通過(guò) break 退出循環(huán),循環(huán)結(jié)束后,會(huì)執(zhí)行的代碼 pass 是空語(yǔ)句,占位用
-
LINUX 上的 Shebang 符號(hào) (#!)
#! 這個(gè)符號(hào)叫做 Shebang 或者 Sha-bang Shebang 通常在 Unix 系統(tǒng)腳本的中 第一行開(kāi)頭 使用 指明 執(zhí)行這個(gè)腳本文件 的 解釋程序 比如在一個(gè).py文件的第一行加入#! /usr/bin/python3, 就可以直接在shell中敲入這個(gè)文件的路徑,就會(huì)用python3解釋運(yùn)行 -
哈希
(hash)-
Python中內(nèi)置有一個(gè)名字叫做hash(o)的函數(shù)- 接收一個(gè) 不可變類型 的數(shù)據(jù)作為 參數(shù)
- 返回 結(jié)果是一個(gè) 整數(shù)
-
哈希是一種 算法,其作用就是提取數(shù)據(jù)的 特征碼(指紋)- 相同的內(nèi)容 得到 相同的結(jié)果
- 不同的內(nèi)容 得到 不同的結(jié)果
- 在
Python中,設(shè)置字典的 鍵值對(duì) 時(shí),會(huì)首先對(duì)key進(jìn)行hash已決定如何在內(nèi)存中保存字典的數(shù)據(jù),以方便 后續(xù) 對(duì)字典的操作:增、刪、改、查- 鍵值對(duì)的
key必須是不可變類型數(shù)據(jù) - 鍵值對(duì)的
value可以是任意類型的數(shù)據(jù)
- 鍵值對(duì)的
-
函數(shù)不能直接修改
全局變量的引用-
函數(shù)不能直接修改
全局變量的值num = 10 def demo1(): # global 關(guān)鍵字,告訴 Python 解釋器 num 是一個(gè)全局變量 global num num = 100 # 如果沒(méi)有上面的global num 這里只會(huì)定義一個(gè)局部變量 print(num) 在 調(diào)用函數(shù)時(shí),如果有 多個(gè)缺省參數(shù),需要指定參數(shù)名,這樣解釋器才能夠知道參數(shù)的對(duì)應(yīng)關(guān)系!
```python
def print_info(name, title="", gender=True):
...
print_info("小明")
print_info("老王", title="班長(zhǎng)")
print_info("小美", gender=False)
```
-
有時(shí)可能需要 一個(gè)函數(shù) 能夠處理的參數(shù) 個(gè)數(shù) 是不確定的,這個(gè)時(shí)候,就可以使用 多值參數(shù)
python中有 兩種 多值參數(shù):- 參數(shù)名前增加 一個(gè)
*可以接收 元組 - 參數(shù)名前增加 兩個(gè)
*可以接收 字典
一般在給多值參數(shù)命名時(shí),習(xí)慣使用以下兩個(gè)名字
-
*args—— 存放 元組 參數(shù),前面有一個(gè)* -
**kwargs—— 存放 字典 參數(shù),前面有兩個(gè)*
args是arguments的縮寫(xiě),有變量的含義kw是keyword的縮寫(xiě),kwargs可以記憶 鍵值對(duì)參數(shù) - 參數(shù)名前增加 一個(gè)
def demo(num, *args, **kwargs):
print(num)
print(args)
print(kwargs)
demo(1, 2, 3, 4, 5, name="小明", age=18, gender=True)
""""
1
(2, 3, 4, 5)
{'name': '小明', 'age': 18, 'gender': True}
""""
-
元組和字典的拆包
在調(diào)用帶有多值參數(shù)的函數(shù)時(shí),如果希望:
- 將一個(gè) 元組變量,直接傳遞給
args - 將一個(gè) 字典變量,直接傳遞給
kwargs
就可以使用 拆包,簡(jiǎn)化參數(shù)的傳遞,拆包 的方式是:
- 在 元組變量前,增加 一個(gè)
* - 在 字典變量前,增加 兩個(gè)
*
- 將一個(gè) 元組變量,直接傳遞給
demo(*tuple, **dic)
使用內(nèi)置函數(shù)
dir傳入 標(biāo)識(shí)符 / 數(shù)據(jù),可以查看對(duì)象內(nèi)的 所有屬性及方法-
類的定義
class Cat: def __init__(self): print("這是一個(gè)初始化方法") # 定義用 Cat 類創(chuàng)建的貓對(duì)象都有一個(gè) name 的屬性 self.name = "Tom" def eat(self): print("%s 愛(ài)吃魚(yú)" % self.name) # 使用類名()創(chuàng)建對(duì)象的時(shí)候,會(huì)自動(dòng)調(diào)用初始化方法 __init__ tom = Cat() tom.eat() 在類封裝的方法內(nèi)部,
self就表示 當(dāng)前調(diào)用方法的對(duì)象自己 在調(diào)用方法時(shí)不用穿self這個(gè)參數(shù)-
內(nèi)置方法和屬性
序號(hào) 方法名 類型 作用 01 __del__方法 對(duì)象被從內(nèi)存中銷毀前,會(huì)被 自動(dòng) 調(diào)用 02 __str__方法 返回對(duì)象的描述信息, print函數(shù)輸出使用 -
身份運(yùn)算符
運(yùn)算符 描述 實(shí)例 is is 是判斷兩個(gè)標(biāo)識(shí)符是不是引用同一個(gè)對(duì)象 x is y,類似 id (x) == id (y) is not is not 是判斷兩個(gè)標(biāo)識(shí)符是不是引用不同對(duì)象 x is not y,類似 id (a) != id (b) 在
Python中針對(duì)None比較時(shí),建議使用is判斷 在 定義屬性或方法時(shí),在 屬性名或者方法名前 增加 兩個(gè)下劃線,定義的就是 私有 屬性或方法
Python中,并沒(méi)有 真正意義 的 私有 。在給 屬性、方法 命名時(shí),實(shí)際是對(duì) 名稱 做了一些特殊處理,使得外界無(wú)法訪問(wèn)到-
使用 類名 () 創(chuàng)建對(duì)象時(shí),
Python的解釋器 首先 會(huì) 調(diào)用__new__方法為對(duì)象 分配空間。重寫(xiě) new 方法 一定要 return super().new(cls)# 單例模式 class MusicPlayer(object): # 定義類屬性記錄單例對(duì)象引用 instance = None def __new__(cls, *args, **kwargs): # 1. 判斷類屬性是否已經(jīng)被賦值 if cls.instance is None: cls.instance = super().__new__(cls) # 2. 返回類屬性的單例引用 return cls.instance 如果想讓
__init__方法也執(zhí)行一次需要添加個(gè)類變量init_flag-
實(shí)例方法、類方法和靜態(tài)方法
- 實(shí)例方法第一個(gè)參數(shù)是self
- 類方法使用@classmethod修飾符
- 靜態(tài)方法使用裝飾器
@staticmethod。 既可以使用類也可以使用實(shí)例來(lái)調(diào)用靜態(tài)方法
繼承
class Child(Parent):super().父類方法調(diào)用父類方法
多繼承繼承``class Child(Father, Mother):
在
Python中 屬性的獲取 存在一個(gè) 向上查找機(jī)制。首先在對(duì)象內(nèi)部屬性中查找,如果沒(méi)有再查找類屬性模塊是 Python 程序架構(gòu)的一個(gè)核心概念。每一個(gè)以擴(kuò)展名
py結(jié)尾的Python源代碼文件都是一個(gè) 模塊-
模塊導(dǎo)入
import 模塊名1, 模塊名2 import 模塊名1 import 模塊名2 import 模塊名1 as 模塊別名 from 模塊名1 import 工具名(全局變量、函數(shù)、類) from 模塊名1 import * #從模塊導(dǎo)入所有工具。這種方式不推薦,因?yàn)楹瘮?shù)重名并沒(méi)有任何的提示,出現(xiàn)問(wèn)題不好排查 如果 兩個(gè)模塊,存在 同名的函數(shù),那么 后導(dǎo)入模塊的函數(shù),會(huì) 覆蓋掉先導(dǎo)入的函數(shù)
Python中每一個(gè)模塊都有一個(gè)內(nèi)置屬性__file__可以 查看模塊 的 完整路徑-
__name__屬性可以做到,測(cè)試模塊的代碼 只在測(cè)試情況下被運(yùn)行,而在 被導(dǎo)入時(shí)不會(huì)被執(zhí)行!便于單文件測(cè)試- 如果 是被其他文件導(dǎo)入的,
__name__就是 模塊名 - 如果 是當(dāng)前執(zhí)行的程序
__name__是 main
# 導(dǎo)入模塊 # 定義全局變量 # 定義類 # 定義函數(shù) # 在代碼的最下方 def main(): # ... pass # 根據(jù) __name__ 判斷是否執(zhí)行下方代碼。 if __name__ == "__main__": main() - 如果 是被其他文件導(dǎo)入的,
-
可以在目錄下創(chuàng)建
__init__.py。import 包名,就可以導(dǎo)入里邊所有模塊# 從 當(dāng)前目錄 導(dǎo)入 模塊列表 from . import send_message from . import receive_message -
如果希望自己開(kāi)發(fā)的模塊,分享 給其他人,可以按照以下步驟操作
- 制作發(fā)布?jí)嚎s包步驟
- 創(chuàng)建 setup.py
from distutils.core import setup setup(name="hm_message", # 包名 version="1.0", # 版本 description="itheima's 發(fā)送和接收消息模塊", # 描述信息 long_description="完整的發(fā)送和接收消息模塊", # 完整描述信息 author="itheima", # 作者 author_email="itheima@itheima.com", # 作者郵箱 url="www.itheima.com", # 主頁(yè) py_modules=["hm_message.send_message", "hm_message.receive_message"])有關(guān)字典參數(shù)的詳細(xì)信息,可以參閱官方網(wǎng)站:
https://docs.python.org/2/distutils/apiref.html
- 構(gòu)建模塊
$ python3 setup.py build- 生成發(fā)布?jí)嚎s包
$ python3 setup.py sdist注意:要制作哪個(gè)版本的模塊,就使用哪個(gè)版本的解釋器執(zhí)行!
* 安裝模塊
```bash
$ tar -zxvf hm_message-1.0.tar.gz
$ sudo python3 setup.py install
```
* 卸載模塊
直接從安裝目錄下,把安裝模塊的 **目錄** 刪除就可以
```bash
$ cd /usr/local/lib/python3.5/dist-packages/
$ sudo rm -r hm_message*
```
-
pip 安裝/卸載第三方模塊
# 將模塊安裝到 Python 2.x 環(huán)境 $ sudo pip install pygame $ sudo pip uninstall pygame # 將模塊安裝到 Python 3.x 環(huán)境 $ sudo pip3 install pygame $ sudo pip3 uninstall pygame -
捕獲異常
try: num = int(input("請(qǐng)輸入整數(shù):")) result = 8 / num print(result) except ValueError: print("請(qǐng)輸入正確的整數(shù)") except ZeroDivisionError: print("除 0 錯(cuò)誤") except Exception as result: print("未知錯(cuò)誤 %s" % result) else: # 沒(méi)有異常才會(huì)執(zhí)行的代碼 pass finally: # 無(wú)論是否有異常,都會(huì)執(zhí)行的代碼 print("無(wú)論是否有異常,都會(huì)執(zhí)行的代碼") -
異常的傳遞 —— 當(dāng) 函數(shù) / 方法 執(zhí)行 出現(xiàn)異常,會(huì) 將異常傳遞 給 函數(shù) / 方法 的 調(diào)用一方
如果 傳遞到主程序,仍然 沒(méi)有異常處理,程序才會(huì)被終止
-
手動(dòng)拋出異常
ex = Exception("密碼長(zhǎng)度不夠") raise ex eval()—— 將字符串 當(dāng)成 有效的表達(dá)式 來(lái)求值 并 返回計(jì)算結(jié)果在開(kāi)發(fā)時(shí)千萬(wàn)不要使用
eval直接轉(zhuǎn)換用戶input的結(jié)果-
使用import導(dǎo)入Python模塊的時(shí)候,默認(rèn)調(diào)用的是
__import__()函數(shù)。直接使用該函數(shù)的情況很少見(jiàn),一般用于動(dòng)態(tài)加載模塊。__import__(name, globals, locals, fromlist, level)只有name是必選參數(shù),其他都是可選參數(shù),一般情況下直接使用name參數(shù)即可。 -
vi是Visual interface的簡(jiǎn)稱,是Linux中 最經(jīng)典 的文本編輯器vi的核心設(shè)計(jì)思想 —— 讓程序員的手指始終保持在鍵盤(pán)的核心區(qū)域,就能完成所有的編輯操作 -
vim = vi improved
vim是從vi發(fā)展出來(lái)的一個(gè)文本編輯器,支持 代碼補(bǔ)全、編譯 及 錯(cuò)誤跳轉(zhuǎn) 等方便編程的功能特別豐富,在程序員中被廣泛使用 -
如果vi是軟連接,通過(guò)命令 ls -l 最后一列就是軟連接的原始地址
$ which vi $ ls -l /usr/bin/vi -
打開(kāi)文件并定位到行
$ vi 文件名 +行數(shù) # 如果只帶上 + 而不指定行號(hào),會(huì)直接定位到文件末尾 -
shell 俗稱殼,c 語(yǔ)言編寫(xiě)的命令解析器程序,是用戶使用 linux 的橋梁。Linux/Unix 提供了很多種 Shell。常用的 shell 有這么幾種,sh、bash、csh 等??梢酝ㄟ^(guò)以下命令,查看系統(tǒng)有幾種 shell:
$ cat /etc/shells