001講
0. Python 是什麼類型的語言?
Python是腳本語言
以簡單的方式快速完成某些複雜的事情通常是創造腳本語言的重要原則。
特性:
- 語法和結構通常比較簡單
- 學習和使用通常比較簡單
- 通常以容易修改程序的“解釋”作爲運行方式,而不需要“編譯”
- 程序的開發產能優於運行性能
一個腳本可以使得本來要用鍵盤進行的相互式操作自動化。一個Shell腳本主要由原本需要在命令行輸入的命令組成,或在一個文本編輯器中,用戶可以使用腳本來把一些常用的操作組合成一組串行。主要用來書寫這種腳本的語言叫做腳本語言。很多腳本語言實際上已經超過簡單的用戶命令串行的指令,還可以編寫更復雜的程序。
1. IDLE 是什麼?
IDLE是一個Python Shell,shell的意思就是“外殼”,基本上來說,就是一個通過鍵入文本與程序交互的途徑!
像我們Windows那個cmd窗口,像Linux那個黑乎乎的命令窗口,他們都是shell,利用他們,我們就可以給操作系統下達命令。同樣的,我們可以利用IDLE這個shell與Python進行互動。
2. print() 的作用是什麼?
print() 會在輸出窗口中顯示一些文本
3. 爲什麼 >>>print('I love fishc.com ' * 5) 可以正常執行,但 >>>print('I love fishc.com ' + 5) 卻報錯?
在 Python 中不能把兩個完全不同的東西加在一起,比如說數字和文本
乘以一個整數來翻倍就具有一定的意義了,前邊的例子就是將 "I love fishc.com" 這個字符串打印五次。
4. 如果我需要在一個字符串中嵌入一個雙引號,正確的做法是?
可以利用反斜槓(\)對雙引號轉義:\"
或者用單引號引起這個字符串。例如:' I l"o"ve fishc.com '。
5.動手試試直接輸入 >>>5+8 與輸入 >>>print(5+8) 有何不同?
不妨試試直接直接輸入 >>>'I love fishc.com!' 與輸入 >>>print('I love fishc.com!') 有何不同?
沒錯,直接輸入是將結果及類型打印到屏幕上,而print是將結果打印到屏幕上
18:35:03 2020-02-10
002講
ctrl+n新建
python要注意縮進 if guess==8:#==判斷是否相等 =賦值
BIF=內置函數(built-in function)
help(bif)瞭解功能
1. 用課堂上小甲魚教的方法數一數 Python3 提供了多少個 BIF?
在 Python 或 IDLE 中,輸入 dir(__builtins__) 可以看到 Python 提供的內置方法列表(注意,builtins 前後是兩個下劃線哦)其中小寫的就是 BIF。如果想具體查看某個 BIF 的功能,比如 input(),可以在 shell 中輸入 help(input),就會得到這個 BIF 的功能描述。哦,答案應該是 68 個。
2. 在 Python 看來:'FishC' 和 'fishc' 一樣嗎?
不一樣,因爲 Python 是一個“敏感的小女孩”,所以不要試圖欺騙她,對 Python 來說,fishc 和 FishC 是完全不同的兩個名字,所以編程的時候一定要當心。不過 Python 會幫助解決可能因此出現的問題,例如只有當標識符已經賦值後(還記得嗎,小甲魚在課堂中說過 Python 的變量是不用先聲明的)才能在代碼中使用,未賦值的標識符直接使用會導致運行時錯誤,所以你很快就可以根據經驗發現此問題。
3. 在小甲魚看來,Python 中什麼是最重要的?你贊同嗎?
縮進!在小甲魚看來,縮進是 Python 的靈魂,縮進的嚴格要求使得 Python 的代碼顯得非常精簡併且有層次。
所以在 Python 裏對待縮進代碼要十分小心,如果沒有正確地縮進,代碼所做的事情可能和你的期望相去甚遠(就像C語言裏邊括號打錯了位置)。
如果在正確的位置輸入冒號“:”,IDLE 會自動將下一行縮進!
4. 這節課的例子中出現了“=”和“==”,他們表示不同的含義,你在編程的過程中會不小心把“==”誤寫成“=”嗎?有沒有好的辦法可以解決這個問題呢?
C語言的話,如果 if( c == 1 ) 寫成 if( c = 1 ),程序就完全不按程序員原本的目的去執行,但在 Python 這裏,不好意思,行不通,語法錯誤!Python 不允許 if 條件中賦值,所以 if c = 1: 會報錯!
5. 你聽說過“拼接”這個詞嗎?
在一些編程語言,我們可以將兩個字符串“相加”在一起,如:'I' + 'Love' + 'FishC' 會得到 'ILoveFishC',在 Python 裏,這種做法叫做拼接字符串。
19:03:00 2020-02-10
003講
變量
變量名不能用數字開頭 大小寫不能忽略
字符串單引號雙引號都可以 但是兩邊要相同
轉義字符\
打印let's let\'s
三重引號字符串
1.除了使用飯斜槓(\)進行字符轉義,還有什麼方法可以打印:Let's go! 這個字符串?
>>>"Let's go!"
>>>str = r'C:\Program Files\FishC\Good''\\'
3.使用變量,計算一年有多少秒?
DaysPerYear = 365
HoursPerDay = 24
MinutesPerHour = 60
SecondsPerMinute = 60
result = DaysPerYear * HoursPerDay * MinutesPerHour * SecondsPerMinute
print(result)
10:24:06 2020-02-11
004講
比較操作符
空格不影響編程 (爲了美觀)
分支語法
if 條件:
條件真(True)
else:
條件(false)
while循環
while條件:
true條件
and邏輯操作符得到bool值
生成隨機數 random模塊
randint()#可以返回一個隨機整數
進入死循環 快捷鍵 CTRL + C(強制結束)
造成死循環的原因是 while 後邊的條件永遠爲真(True),在 Python 看來,只有以下內容會被看作假(注意冒號括號裏邊啥都沒有,連空格都不要有!):False None 0 "" '' () [] {}
1. 請寫出與 10 < cost < 50 等價的表達式
(10 < cost) and (cost < 50)
2. Python3 中,一行可以書寫多個語句嗎?
可以,語句之間用分號隔開即可,不妨試試:
>>> print('I love fishc');print('very much!')
3. Python3 中,一個語句可以分成多行書寫嗎?
可以 一行過長的語句可以使用反斜槓或者括號分解成幾行
3>4 and \
1<2
( 3 > 4 and
1 < 2 )
4. 請問Python的 and 操作符 和C語言的 && 操作符 有何不同?
python
1and3 ->4 0and1 ->0
C
1&&3 ->1 0 &&1 ->0
5.
temp = input('請輸入一個整數:')
number = int(temp)
while number:
i = number - 1
while i:
print(' ', end = '')
i = i - 1
j = number
while j:
print('*', end = '')
j = j - 1
print()
number = number - 1
13:18:08 2020-02-11
005講
數值類型
整型 長度不受限制
浮點型 (區分整型有小數點)
e記法
bool型 true=1 false=0
相互轉換
a=5.99 c=int(a) c=5 截取整數部分
a=520 b=float(a) b=520.0
a=5.99 b=str(a) b='5.99'
c=str(5e19) c= '5e19'
type() #確定類型
isinstance()
eg: insintance(a,str) 返回true
insintance(a,int) 返回false
1. 你知道爲什麼布爾類型(bool)的 True 和 False 分別用 1 和 0 來代替嗎?
你可能聽說過計算機是很“笨”的,究其根本是因爲它只認識二進制數,所以所有的編程語言最終都會轉換成簡單的二進制序列給 CPU 按照一定的規則解析。
由於二進制只有兩個數:0 和 1,因此用 0 和 1 來表示 False 和 True 再適合不過了,因爲不用浪費資源在轉換的過程上!
2. 使用 int() 將小數轉換爲整數,結果是向上取整還是向下取整呢?
小數取整會採用比較暴力的截斷方式,即向下取整。
但那是對於正數來說……對於負數則剛好相反 —— 是向上取整。
3. 我們人類思維是習慣於“四捨五入”法,你有什麼辦法使得 int() 按照“四捨五入”的方式取整嗎?
int() 固然沒那麼“聰明”,但機器是死的,魚油是活的!
5.4 “四捨五入”結果爲:5,int(5.4+0.5) == 5
5.6 “四捨五入”結果爲:6,int(5.6+0.5) == 6
13:32:12 2020-02-11
006講
算術操作符 + - * /
%取餘
**冪乘
3**2 三的二次冪
/返回浮點型
// 地板除法
10//8得到1
3.0//2.0得到1.0
a=a+3 -> a+=3
優先級 先乘除再加減 右括號先算括號裏的
比較操作符 優先於 邏輯操作符
一元(單目)操作符
雙目操作符
冪運算 高於左面 低於右面
------------------------------------------------------------------------------------------------------------
邏輯操作符 and or not
and 同真爲真
or 一真爲真
not 一元 取反
4. 請用最快速度說出答案:not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9
如果你的回答是 0,那麼小甲魚很開心你中招了!
答案是:4
not or and 的優先級是不同的:not > and > or
我們按照優先級給它們加上括號:(not 1) or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9)
== 0 or 0 or 4 or 6 or 9
== 4
爲啥是 4?
大家還記得第四講作業提到的“短路邏輯”嗎?3 and 4 == 4,而 3 or 4 == 3。
所以答案是:4
13:43:00 2020-02-11
007講 008講 009講
分支和循環
框架
加載背景音樂
播放背景音樂(循環)
我方飛機誕生
interval = 0 #定義一個間隔
while true
if 用戶x掉
退出
interval += 1
if interval ==50:
interval = 0:
小飛機誕生
小飛機移動位置
屏幕刷新
if用戶鼠標移動
我方飛機中心位置=鼠標位置
屏幕刷新
if 我方與對方撞擊
我方掛 切換撞擊音樂
修改圖案
打印game over
停止音樂 最好淡出
elif -> else if
懸掛else else匹配錯誤
條件表達式 三元操作符
斷言 assert #用於置入檢查點 保證條件真才正常工作
assert後條件爲假 自動崩潰 拋出assertionerror異常
>>>assret 3>4
assert這個關鍵字我們稱之爲“斷言”,當這個關鍵字後邊的條件爲假的時候,程序自動崩潰並拋出AssertionError的異常。
什麼情況下我們會需要這樣的代碼呢?當我們在測試程序的時候就很好用,因爲與其讓錯誤的條件導致程序今後莫名其妙地崩潰,不如在錯誤條件出現的那一瞬間我們實現“自爆”。
一般來說我們可以用Ta再程序中置入檢查點,當需要確保程序中的某個條件一定爲真才能讓程序正常工作的話,assert關鍵字就非常有用了。
while條件:
循環體
for循環
for 目標 in 表達式:
循環體
range()
range([start,] stop [, step=1] )
break continue
break 終止循環 跳出循環體
continue 終止本輪循環 並開始下一輪循環 開始下一輪循環前測試循環條件 true 開始下一輪循環
1. 你聽說過成員資格運算符嗎?
Python 有一個成員資格運算符:in,用於檢查一個值是否在序列中,如果在序列中返回 True,否則返回 False。
例如:
- >>> name = '小甲魚'
- >>> '魚' in name
- True
- >>> '肥魚' in name
- False
15:17:43 2020-02-11
010講
列表
數組 放在一起數據必須類型一致
Python無數組 有列表
創建普通列表 用 [ , , , , , ] 創建
可以放不用類型元素
可以創造空列表 empty=[]
向列表添加元素->append()
用 . 調用
只能添加一個元素
extend() #使用一個列表 擴展另一個列表
insert() #兩個參數 第一個是位置 第二個是插入元素內容 從0開始
16:24:04 2020-02-11
011講
從列表中獲取元素 #索引值從0開始
menber[0]
交換 01位置元素
temp=member[0]
member[0] = member[1]
member[1] = temp
刪除
remove() #必須知道元素具體名字
member.remove('fish ')
del
del member[1]
還可以用於刪除整個列表->del member
pop () #python是用棧存儲
member.pop()
列表分片Slice
包頭不包尾 左閉右開
member[ : ] # 用途 要修改列表 把之前的做一個拷貝member2=member[ : ]
如果直接=member 那麼 member改變 2也改變
012講
常用列表操作符
比較操作符
列表不相等 返回第一個元素比較值
邏輯操作符
連接操作符
錯誤:
重複操作符
成員關係操作符 in not in
無法判斷列表裏的列表 只能判斷一個層次內的是否存在
列表中的列表中元素值 list[1][1] #類似C語言的二維數組
count ->list3 . count(123) #123在list3中出現多少次
index -> list3.index(123) #123的位置
list3.index(123,3,7) #123在列表3-7範圍 出現的位置
reverse ->list3. reverse() #整個列表翻轉
sort ->list3.sort() #從小到大排序
->sort(func,key)
->sort(reverse=true)->list3.sort(reverse=true) #從大到小排序
17:02:04 2020-02-11
013講
元組tuple #與列表相似 元素一點定義不可改變
創建和訪問元組
與列表相似
修改一個元素會報錯
元組標誌是,不是() ->如果只有一個元素則需要在後面加,
更新和刪除元組
在元組中插入一個元素
拆分成兩半 然後用拼接操作符 分別拷貝一下 再插入
元組相關操作符: 拼接、重複 (*8)、邏輯、關係、成員in not in
17:24:16 2020-02-11
014講
字符串的方法及註釋 Python -help 可以查找幫助
capitalize() | 把字符串的第一個字符改爲大寫 | |
casefold() | 把整個字符串的所有字符改爲小寫 | |
center(width) | 將字符串居中,並使用空格填充至長度 width 的新字符串 | |
count(sub[, start[, end]]) | 返回 sub 在字符串裏邊出現的次數,start 和 end 參數表示範圍,可選。 | |
encode(encoding='utf-8', errors='strict') | 以 encoding 指定的編碼格式對字符串進行編碼。 | |
endswith(sub[, start[, end]]) | 檢查字符串是否以 sub 子字符串結束,如果是返回 True,否則返回 False。start 和 end 參數表示範圍,可選。 | |
expandtabs([tabsize=8]) | 把字符串中的 tab 符號(\t)轉換爲空格,如不指定參數,默認的空格數是 tabsize=8。 | |
find(sub[, start[, end]]) | 檢測 sub 是否包含在字符串中,如果有則返回索引值,否則返回 -1,start 和 end 參數表示範圍,可選。 | |
index(sub[, start[, end]]) | 跟 find 方法一樣,不過如果 sub 不在 string 中會產生一個異常。 | |
isalnum() | 如果字符串至少有一個字符並且所有字符都是字母或數字則返回 True,否則返回 False。 | |
isalpha() | 如果字符串至少有一個字符並且所有字符都是字母則返回 True,否則返回 False。 | |
isdecimal() | 如果字符串只包含十進制數字則返回 True,否則返回 False。 | |
isdigit() | 如果字符串只包含數字則返回 True,否則返回 False。 | |
islower() | 如果字符串中至少包含一個區分大小寫的字符,並且這些字符都是小寫,則返回 True,否則返回 False。 | |
isnumeric() | 如果字符串中只包含數字字符,則返回 True,否則返回 False。 | |
isspace() | 如果字符串中只包含空格,則返回 True,否則返回 False。 | |
istitle() | 如果字符串是標題化(所有的單詞都是以大寫開始,其餘字母均小寫),則返回 True,否則返回 False。 | |
isupper() | 如果字符串中至少包含一個區分大小寫的字符,並且這些字符都是大寫,則返回 True,否則返回 False。 | |
join(sub) | 以字符串作爲分隔符,插入到 sub 中所有的字符之間。 | |
ljust(width) | 返回一個左對齊的字符串,並使用空格填充至長度爲 width 的新字符串。 | |
lower() | 轉換字符串中所有大寫字符爲小寫。 | |
lstrip() | 去掉字符串左邊的所有空格 | |
partition(sub) | 找到子字符串 sub,把字符串分成一個 3 元組 (pre_sub, sub, fol_sub),如果字符串中不包含 sub 則返回 ('原字符串', '', '') | |
replace(old, new[, count]) | 把字符串中的 old 子字符串替換成 new 子字符串,如果 count 指定,則替換不超過 count 次。 | |
rfind(sub[, start[, end]]) | 類似於 find() 方法,不過是從右邊開始查找。 | |
rindex(sub[, start[, end]]) | 類似於 index() 方法,不過是從右邊開始。 | |
rjust(width) | 返回一個右對齊的字符串,並使用空格填充至長度爲 width 的新字符串。 | |
rpartition(sub) | 類似於 partition() 方法,不過是從右邊開始查找。 | |
rstrip() | 刪除字符串末尾的空格。 | |
split(sep=None, maxsplit=-1) | 不帶參數默認是以空格爲分隔符切片字符串,如果 maxsplit 參數有設置,則僅分隔 maxsplit 個子字符串,返回切片後的子字符串拼接的列表。 | |
splitlines(([keepends])) | 在輸出結果裏是否去掉換行符\n,默認爲 False,不包含換行符;如果爲 True,則保留換行符。。 | |
startswith(prefix[, start[, end]]) | 檢查字符串是否以 prefix 開頭,是則返回 True,否則返回 False。start 和 end 參數可以指定範圍檢查,可選。 | |
strip([chars]) | 刪除字符串前邊和後邊所有的空格,chars 參數可以定製刪除的字符,可選。 | |
swapcase() | 翻轉字符串中的大小寫。 | |
title() | 返回標題化(所有的單詞都是以大寫開始,其餘字母均小寫)的字符串。 | |
translate(table) | 根據 table 的規則(可以由 str.maketrans('a', 'b') 定製)轉換字符串中的字符。 | |
upper() | 轉換字符串中的所有小寫字符爲大寫。 | |
zfill(width) | 返回長度爲 width 的字符串,原字符串右對齊,前邊用 0 填充。 | z->zero |
20:00:36 2020-02-11
015講
format方法 字符串的格式化問題 按照統一規格輸出
位置參數
關鍵字參數
可以綜合使用,但位置 參數要在關鍵字參數之前
字符串格式化符號轉義
符號
|
說明
|
|
%c
|
格式化字符及其 ASCII 碼 | |
%s
|
格式化字符串 | |
%d
|
格式化整數 | |
%o
|
格式化無符號八進制數 | |
%x
|
格式化無符號十六進制數 | |
%X
|
格式化無符號十六進制數(大寫) | |
%f
|
格式化浮點數字,可指定小數點後的精度 | |
%e
|
用科學計數法格式化浮點數 | |
%E
|
作用同 %e,用科學計數法格式化浮點數 | |
%g
|
根據值的大小決定使用 %f 或 %e | |
%G
|
作用同 %g,根據值的大小決定使用 %f 或者 %E |
格式化操作符輔助命令
符號
|
說明
|
|
m.n
|
m 是顯示的最小總寬度,n 是小數點後的位數 | |
-
|
用於左對齊 | |
+
|
在正數前面顯示加號(+) | |
#
|
在八進制數前面顯示 '0o',在十六進制數前面顯示 '0x' 或 '0X' | |
0
|
顯示的數字前面填充 '0' 取代空格 |
Python 的轉義字符及其含義
符號
|
說明
|
\'
|
單引號 |
\"
|
雙引號 |
\a
|
發出系統響鈴聲 |
\b
|
退格符 |
\n
|
換行符 |
\t
|
橫向製表符(TAB) |
\v
|
縱向製表符 |
\r
|
回車符 |
\f
|
換頁符 |
\o
|
八進制數代表的字符 |
\x
|
十六進制數代表的字符 |
\0
|
表示一個空字符 |
\\
|
反斜槓 |
17:22:12 2020-02-12
016講
序列
列表 元組 字符串
list()把一個可迭代對象轉換爲列表
不帶參數 生成一個空列表
帶一個iterable迭代器
sum
>>>list(ennumberate(numbers)) #列表每個元素變成一個元組,,元組前加了一個index值
zip a=[1,2,3,4,5,6] b=[1,2,3] >>>list (zip(a,b)) [(1,1),(2,2),(3,3)] #成對打包
20:26:49 2020-02-12