轉載本文章請標明作者和出處
本文出自《Darwin的程序空間》
vlog
- 時間:2020年02月28日-2020年03月01日 ——————兩個白天,一個通宵
- 學習方式:視頻(黑馬),博客,百度
- 完成內容:python基礎語法
- 博客目的:總結歸納,當然要能幫助其他剛學習Python的童鞋,不勝榮幸
- 人物:一個心血來潮學習Python的JAVA程序員
文章目錄
正文
入門基礎
- Python之父:吉多,人生格言:人生苦短,我用Python
- Python是一門解釋型語言
- 解釋型語言
解釋型語言是直接把腳本丟給解釋器執行,解釋器是跨平臺的,所以開發者是不用考慮跨平臺問題的;Java、Python都是解釋型語言,解釋型語言每條語句都是執行到了才翻譯的,效率比較低,java在丟給虛擬機(解釋器)之前還有一個編譯的步驟,.class文件有點像中間語言的意思。 - 編譯型語言
編譯型語言,如C、C++,是直接把源文件編譯成機器語言,直接丟給操作系統執行,但是如果是不同的操作系統,所需要的二進制文件是不一樣的,所以編譯型語言移植操作系統以後,是需要重新編譯的。但是因爲是直接執行整個機器語言的文件,所以效率會相對解釋型語言來說比較快。
- 解釋型語言
- Python語言的設計哲學
- 優雅、明確、簡單,一版情況下,Python的代碼量是Java的1/5
- python是一門完全面向對象的語言,擁有十分強大的標準庫和第三方庫
- 第一次寫Python程序須知
- Python程序其實就是一個特殊格式的文本文件
- Python文件的拓展名通常是以.py結尾的
- Python中不能將多行代碼寫到一行,一行代碼只完成一件事情,一行代碼寫多行,如條件判斷很長,使用“\”,Python會當做一行處理
- Python中是用縮進來代替大括號的,所以不正確的縮進也會報錯
- Python2不支持中文,Python3支持
- Python3是2008年發佈的,並不向下兼容2.*版本;
- 運行Python程序的方法
- 使用解釋器,python 文件名.py;解釋器官方版本是C語言寫的,還有其他用JAVA等語言寫的解釋器版本
- python shell 交互式
- ipython 帶自動補全和縮進的shell;ipython需要安裝 pip install ipython
- 集成開發環境,IDE (一般使用pycharm)
註釋
- Python的註釋
- 單行註釋
- 行首# 加空格加註釋內容
- 代碼後空兩格加#加空一格加註釋內容
- 多行註釋
- 上下三個雙引號或者三個單引號中間加註釋
- 單行註釋
算數運算符及優先級
- 算數運算符
- + 加
- - 減
- * 乘 (字符串*一個數字會重複數字對應遍)
- / 除(9/2=4.5)
- // 整除 (9//2=4)
- % 取餘(9%2=1)
- **(冪 2**3=8)
- 優先級
- 第一級別 **
- 第二級別 * / // %
- 第三級別 + -
- 高級別的先執行,同級別從左往右執行,括號可以改變執行的順序
程序執行原理
-
計算機三大件
- CPU:中央處理器,幹活的
- 內存:臨時保存數據的,速度特地快,重啓數據就沒了
- 硬盤 :永久性存儲數據的,速度比較慢
-
執行原理
CPU會先把解釋器加載到內存中(解釋器python2.7的是3.5M),再把程序加載到內存,然後CPU根據解釋器去翻譯並運行python程序
變量
概念和定義方式
- 變量就是程序在內存中要保存數據而開闢的一小塊內存空阿金
- 使用交互式方式的時候,查看變量的值,直接輸入變量名即可,不需要使用print函數;如果通過解釋器輸出變量的內容的話,需要通過print函數
- 變量的定義: 變量名 = 值 (不需要聲明類型,運行的時候解釋器會根據我們數據的內容自動推倒出保存的類型)
變量的命名
- 變量名由字母、下劃線和數字組成
- 變量名開頭不能是數字
- 變量名不能與關鍵字重複
import keyword print(keyword.kwlist)
- 上面三條不遵守解釋器是會報錯的
- 在Python中變量名如果由多個單詞組成,我們一般多個單詞都是小寫然後用下劃線隔開 qq_number
變量的作用域
Python除了def/class/lambda 外,其他如: if/elif/else/ try/except for/while並不能改變其作用域。定義在他們之內的變量,外部還是可以訪問(與JAVA語法不同)
變量的輸入和輸出
- 輸入 input函數,可以接受鍵盤錄入的數據
- 變量名稱 = input(“提示信息:”)
- input輸入的內容都是字符串
- 類型的轉換函數
- int(str) 將字符串轉換成int
- float(str) 將字符串轉換成float
- str(任意類型) 將任意類型轉換爲字符串
- 輸出 格式化字符串
- %s代表字符串類型的數據
- %d輸出整數,%06d代表輸出整數的位數,不足用0補全,超出6位該是多少就是多少
- %f輸出浮點數,%.02f代表輸出小數點後兩位
- %%輸出百分號
- 語法
- print(“格式化字符串” % 變量1)
- print(“格式化字符串” % (變量1,變量2,變量3)) 後面的其實就是一個元組
數據類型
- 使用type()函數可以查看一個變量的數據類型
- 數值型的變量是直接可以進行算數運算符的計算的,包括bool型
- True會當做1
- False會被當做0
數值型
- 整型int ,在Python2.*中是區分int和long型的,在Python3中long型就被取代了,只有int類型
- 浮點型 float
- 布爾型 bool
- 真 True (非0即True)
- 假 False 0
- 參與算數運算的時候,True會被當做1,False會被當做0
- 複數型complex 主要用於科學計算(暫未了解)
非數值型
列表
- 列表是Python中使用最頻繁的數據類型
- 列表用[]定義,數據之間是用,(逗號)隔開
- 列表用[]定義,數據之間是用,隔開
- list = [“zhangsan”,“lisi”,“wangwu”]
list = [] 定義一個空列表 - list[索引值] 獲取元素(切片的一種)
- 方法
- 增加
- list.insert(索引,數據) 在指定的位置插入數據
- list.append(數據) 在末尾添加數據
- 列表.extend(列表2) 將列表2的數據追加到列表
列表 += 列表2 和上面的作用相等
- 修改
- 列表[索引] = 數據 修改指定索引下的數據
- 刪除
- del 列表[索引] 刪除指定索引的數據(本質上是將一個變量從內存中刪除,不建議使用)
- 列表.remove[數據] 刪除列表中第一個出現的數據
- 列表.pop() 刪除末尾的數據
- 列表.pop(索引) 刪除指定索引的數據
- 列表.clear() 清空列表
- 統計
- len(列表) 列表的長度
- 列表.count(元素) 統計列表中元素出現的個數
- 列表.index(元素) 知道元素內容,確定索引
如果列表中沒有這個元素就會報錯
- 排序
- 列表.sort() 排序、升序
- 列表.sort()、sort(reverse=True) 排序、降序
- 列表.reverse() 反轉列表
-
循環遍歷
for 變量名 in 列表: 循環內部對列表元素的操作
- 增加
- python中列表可以存儲不同數據類型,但是實際開發中我們一般存儲相同的數據類型
元組
-
元組與列表類似,但是元組的元素不能修改
-
元組用()定義,中間的元素用,逗號隔開
- 空元組 empty_tuple = ()
- 只有一個元素的元組 single_tuple = (元素,)
只有一個元素,元素後面需要加一個逗號,要不直接就定義的是元素的類型的變量,而不是元組
(1)是定義了一個int型的1(1,)纔是定義了一個元組
-
元組中通常可以保存不同類型的數據
-
統計方法
- len(元組) 元組的長度
- 元組.count(元素) 統計元組中元素出現的個數
- 元組.index(元素) 知道元素內容,確定索引
如果元組中沒有這個元素就會報錯
-
循環遍歷
for 變量名 in 元組: 循環內部對元組元素的操作
在實際開發中,除非能確定元組每個元素的類型,否則不會遍歷元組,因爲元組保存的元素的數據類型是不同的
-
元組的應用
- 當做函數的參數和返回值,可以接受多個參數和返回多個參數
- 格式化字符串後面的()其實就是一個元組
- 讓列表不被其他人修改,保護列表中數據安全
列表與元組的互相轉換
- list(元組) 元組轉列表
- tuple(列表) 列表轉元組
字典
- 字典是除了列表以外最靈活的數據類型,dictionary是無序的對象集合,使用{}來定義
- 字典使用鍵值對存儲數據,鍵值對使用逗號進行分隔;
鍵和值用:來分隔;
鍵必須是唯一的;
值可以是任何數據類型,但是鍵只能是元組、字符串或者數字(因爲鍵只能是不可變數據類型,列表和字典是可變型) - 定義
- xiaoming = {“name”:“小明”,“age”:18}
- xiaoming = {} 定義一個空字典
- 函數
- len(字典) 獲取字典的鍵值對數量
- 字典.keys() 所有key 的列表
- 字典.values() 所有的值列表
- 字典.items() 所有的(key,value)元組列表
- 操作
- 取值,字典[key值],如果不存在key會報錯
- 增加/修改,字典[key] = value 向字段中新增鍵值對,如果key不存在是新增,存在就是修改
- 刪除,字典.pop(key) 如果key不存在的話會報錯
- 合併字典,字典1.update(字典2) 將字典2合併到字典1,如果字典2有字典1的鍵,會將其鍵值對覆蓋
- 清空字典,字典.clear() 將字典的所有鍵值對清空
- 遍歷字典
for key in 字典: print("key=%s,value=%s" % (key,字典[key]))
Set
-
set裏面存儲單個值,且是無序的,不重複的,存入相同的元素會自動去重
-
定義一個空set:set_1 = set(),因爲{}是用來定義空字典的
-
set有值定義
set_1 = { "name", "age" }
-
set 轉列表和元組:list(set)、tuple(set)
-
列表和元組轉set:set(列表或元組)
-
set的遍歷,和元組、列表的遍歷方式一樣
for 元素 in set: 遍歷的操作
-
set的運算符操作
print(set_1 | set_2) # set1和set2的並集 print(set_1 & set_2) # set1和set2的交集 print(set_1 - set_2) # set1和set2的差集(set1比set2多的部分) print(set_1 ^ set_2) # set1和set2中不公共存在的元素
字符串
-
一對單引號或者一對雙引號引起來的一串字符叫做字符串
-
獲取字符串裏面的字符,可以使用字符串[索引];
也可以使用for循環遍歷for char in 字符串: print(char)
-
方法
-
len(字符串) 獲取這個字符串的長度
-
字符串.count(字符串1) 獲取字符串中子字符串1出出現的次數(如果不存在不會報錯)
-
字符串.index(字符串1)獲得小字符串1第一次出現的索引
(如果不存在會報錯) -
判斷|查找|替換類型的方法
- string.isspace() 如果string裏面只包含製表符或者空格,返回True,空字符串返回False
- 字符串.startwith(字符串) 判斷是否以指定的字符串開始
- 字符串.endwith(字符串) 判斷是否以指定的字符串結束
- 字符串.find(字符串) 查找包含的字符串,存在的話返回開始的索引,不存在的話返回-1,index方法會操作,這個不會
- 字符串.replace(舊字符串,新字符串) 替換字符串裏面的子字符串,會返回一個新的字符串,原有的字符串不會被修改(str是不可變類型的變量)
-
文本對齊
- string.ljust(width) 返回一個元字符串左對齊,並且使用空格填充至長度width的新字符串
- string.rjust(width) 返回一個元字符串左對齊,並且使用空格填充至長度width的新字符串
- string.center(width) 返回一個元字符串中間對齊,並且使用空格填充至長度width的新字符串
-
去除空白字符
- string.lstrip() 截掉左邊的空白字符
- string.rstrip() 截掉右邊的空白字符
- string.strip() 截掉兩邊的空白字符
-
拆分和合並
- string.split() 把大的字符串拆分成一個字符串列表
- string.join(序列) 以string爲分隔符,將調用方法的字符串當做分隔符,把序列(列表、元組、字典)拼接成一個字符串
- 拼接方式
- 兩個字符串使用+號進行拼接
- 一個字符串乘以一個整數可以把這個字符串重複整數次
- 除此以外,字符串是不能和整數型有任何操作,比如字符串+10就會報錯
-
在Python中所有非數字型變量都支持的特點
- 都是一個序列,也可以理解爲容器
- 取值 []
- 遍歷 for in
- 計算長度len()、最大值max()、最小值min()、刪除del()
- 連接+和重複*(字典沒有*)
- 元素 in 序列 判斷元素是否在序列中,字典只針對key
- 元素 not in 序列 判斷元素是否不再序列中,字典只針對key
- 切片
-
切片的方法適用於字符串、列表和元組(字典使用的hash是沒有順序的)
-
字符串[開始索引:結束索引:步長]
結果不包含結束索引的內容;
步長指的是切完第一刀,隔幾個再切第二個;
倒序索引-1指的是倒數第一個索引,不包含最後一個,要包含最後一個,結束索引不指定即可; -
習題
# 字符串的切片 (開始索引:結束索引:步長) str_num = "0123456789" # 截取2-5的字符串 print(str_num[2:6]) # 截取2到結束的字符串 print(str_num[2:]) # 截取開始到5的字符串 print(str_num[:6]) # 截取完整的字符串 print(str_num[:]) # 每隔一個截取的字符串 print(str_num[::2]) # 截取開始到倒數第二個字符串 print(str_num[:-1]) # 截取最後兩個字符 print(str_num[-2:]) # 字符串倒序 print(str_num[::-1])
- Python的索引方式
- Python的索引方式
-
查看在內存中的地址 id()
-
完整的for循環
for 變量 in 集合:
循環代碼
else:
如果沒有通過break跳出循環,循環結束之後會執行的代碼
有continue語句也會執行else,只有有break不會執行
可變數據類型和不可變數據類型
- 不可變數據類型,內存中的數據不允許被修改(int、float、bool、complex、元組、字符串)
- 可變數據類型,內存中的數據可以修改(字典和列表)
- 字典的鍵只可以是不可變數據類型
局部變量和全局變量
- 局部變量是函數內部定義的變量,只能在函數的內部使用;
全局變量是在函數外部定義的變量(沒有定義在某一個函數內),所有函數內部都可以使用這個變量 - 局部變量在函數執行結束之後會被系統回收,局部變量可以重名
- 在python中是不允許直接修改全局變量的值的,如果修改,會默認定義了一個與全局變量名稱一樣的局部變量,如果確實希望對全局變量進行修改,可以聲明一下global 變量名,然後在操作變量就是操作的全局變量
- 如果我們希望在代碼中使用全局變量我們一般把全局變量定義到文件的最上方
- 全局變量的命名一版前面加g_或者gl_
- 編寫代碼的順序
邏輯語句
- if elif else語句的語法
if 要判斷的條件: 要輸出的語句 elif 要判斷的條件: 要輸出的語句 else: 條件不成立的時候,要執行的代碼
- 比較運算符
- == 等於
- != 不等於 在Python2中不等於還可以使用<>來表示,在Python3中被取消了
- <= 小於等於
- >= 大於等於
- < 小於
- 大於 >
- 邏輯運算符
- and 與,兩邊都成立纔是True
條件1 and 條件2 - or 或,兩邊只要有一個滿足就成立
條件1 or 條件2 - not 非,對一個條件進行取反
not 條件1
- and 與,兩邊都成立纔是True
- 小遊戲石頭剪刀布
-
生成一個0到2的隨機數
import random computer = random.randint(0, 2)
-
循環
-
程序的三大流程
- 順序執行,從上到下
- 分支,根據條件判斷,讓程序走特定的分支
- 循環,讓特定的代碼重複執行
-
語法
初始執行條件,通常是計數器 while 條件: 條件滿足的時候,需要做的事 計數器的值的變動
-
死循環
- 程序員在循環內部忘記修改循環判斷條件,導致程序循環執行,無法終止
-
賦值運算符
- = 、+=、-=、*=、/=、//=、%=、**=
- break 跳出當前循環
- continue 結束本次循環,繼續下次循環
- print函數
- print函數默認會在末尾加上換行
- 如果不希望在輸出的內容末尾加上換行
print(“要打印的內容”,end="")
函數
-
具有獨立功能的小模塊,在需要的時候調用
-
只有在函數定義之後再調用纔可以,在一個文件中,調用在上,函數定義在下是會報錯的
-
定義函數,def是定義的意思
def 函數名(): 函數封裝的代碼 ....
-
函數的命名規則和變量的命名規則是相同的
-
註釋
- 函數的註釋應該定義在函數下方,連續使用三個引號
- 在函數調用的地方,使用ctrl+Q快捷鍵,可以看到定義的註釋
-
參數
-
定義
def 函數名(num1,num2): 函數封裝的代碼 ....
-
形參是在函數小括號內部定義的參數,在函數內部可以當真正的參數使用
-
實參是調用函數的時候傳遞的參數
-
缺省參數
- 定義函數的時候,可以給某個參數指定一個默認值,如果沒有傳這個參數,這個參數默認就使用默認值
- 在參數後面使用賦值語句,就可以指定參數的缺省值;
def print_info(name,gender=True): 函數體...
- 缺省參數必須在整個參數列表的末尾,可以末尾有多個缺省參數,調用有多個缺省參數的函數的時候需要指定參數的名稱list.sort(reverse=True)
- 多值參數
- 參數前增加一個號接收元組,一般參數起名爲args
- 參數前增加兩個*接收字典,一般參數起名爲**kwargs
- *agrs和**kwargs同時存在,必須*args在前
- *agrs後面可以有缺省參數,**kwargs後面不可以有
- 使用方式
def test(*args, **kwargs): print(args) print(kwargs) test(1, 2, 3, 4, name="YH", age=18)
- 拆包
-
如果直接把一個元組變量和字典變量傳遞給多值參數,會都被元組接受,解決的方法就是拆包
-
案例
def test(*args, **kwargs): print(args) print(kwargs) list = [1, 2, 3] map = {"name": "1", "age": 2} test(list, map) 這麼傳的話*args會包括一個列表元素和一個字典元素長度爲2而**kwargs會爲空
拆包之後就是正確的
def test(*args, **kwargs): print(args) print(kwargs) list = [1, 2, 3] map = {"name": "1", "age": 2} test(*list, **map) 拆包之後是正確的
-
- 返回值
- return 之後的代碼都不會執行
- 調用函數的一方使用變量來接受返回結果
- 如果函數的返回類型是元組,那麼小括號可以省略
- 交換兩個變量的值(利用元組),a,b=b,a
- 可以使用多個變量來接收返回的元組 gl_1,gl_2 = fun1()
- python沒有函數的重載,也就是你不能定義兩個相同名稱的參數,哪怕它們的參數列表不同
- 如果函數返回值是空,直接return,那麼它接受返回值的變量is None
- 遞歸,自己調用自己
-
模塊
- 模塊就好比是一個工具包,要想使用這個工具包中的工具,就要導入這個模塊;
每一個以拓展名py結尾的Python源代碼文件都是一個模塊;
在模塊中定義的全局變量、函數都是模塊能提供給外界直接使用的工具 - 模塊名的命名規則和變量的命名規則一樣
- 使用import導入的模塊python解釋器識別之後會編譯成.pyc文件放到項目同級目錄__pycache__下,這樣導入的文件的內容就可以直接用了,不用一行一行解釋
明信篇管理代碼
- cards_main
"""
名片管理系統V1.0
"""
import cards_tools
while True:
cards_tools.welcome_print()
input_str = input("請輸入您的操作: ")
if input_str in ["1", "2", "3"]:
if "1" == input_str:
cards_tools.add_card()
elif "3" == input_str:
cards_tools.select_all()
elif "2" == input_str:
cards_tools.opera_card()
elif input_str == "0":
print("歡迎再次使用名片管理系統,再見~~~")
break
else:
print("您輸入的操作有誤————請重新選擇您的操作")
- cards_tools
card_list = []
def welcome_print():
"""
名片系統歡迎提示詞打印
"""
print("*" * 50)
print("歡迎來到名片管理系統V1.0")
print("輸入1: 新增名片")
print("輸入2: 管理名片")
print("輸入3: 查詢所有名片")
print("")
print("輸入0: 退出系統")
print("*" * 50)
def add_card():
"""
添加名片
"""
name = input("請輸入姓名")
phone = input("請輸入電話")
age = input("請輸入年齡")
email = input("請輸入email地址")
card_list.append({
"name": name,
"phone": phone,
"age": age,
"email": email
})
def del_card():
"""
刪除名片
"""
name = input("請輸入您要刪除的名片人的名字: ")
card = select_card(name)
if card is None:
return
else:
card_list.remove(select_card(name))
def opera_card():
"""
對名片進行操作
"""
print("輸入1: 刪除名片")
print("輸入2: 修改名片")
opera = input("請輸入您的對應操作")
if opera in ["1", "2"]:
if "1" == opera:
del_card()
elif "2" == opera:
card = select_card(input("請輸入您要查詢的名片的姓名"))
if card is None:
return
else:
card["name"] = check(card["name"], input("請輸入您要修改的名稱"))
card["phone"] = check(card["phone"], input("請輸入您要修改的電話"))
card["age"] = check(card["age"], input("請輸入您要修改的年齡"))
card["email"] = check(card["email"], input("請輸入您要修改的郵件地址"))
print("修改名片成功")
else:
print("您的輸入有誤")
def select_card(name):
"""
根據名稱查找名片
"""
for card in card_list:
if card["name"] == name:
return card
else:
print("你所查找的<%s>不存在" % name)
return
def select_all():
"""
查詢全部
"""
if (n := len(card_list)) == 0:
print("系統內暫無人員")
return
else:
for temp in ["姓名", "電話", "姓名", "郵件"]:
print(temp, end="\t")
print("")
print("=" * 50)
for card in card_list:
print("%s\t\t%s\t\t%s\t\t%s" % (card["name"], card["phone"], card["age"], card["email"]))
def check(str_opera, input_str):
"""
校驗是否輸入
"""
if len(input_str) == 0:
return str_opera
else:
return input_str