以下為學(xué)python以來(lái)知識(shí)點(diǎn)及練習(xí)記錄,用于個(gè)人知識(shí)點(diǎn)復(fù)習(xí)
DAY01-02 介紹、變量、格式化輸出
1.python是編譯型語(yǔ)言還是解釋性語(yǔ)言,兩種類(lèi)型的語(yǔ)言的程序有什么不同?
答:解釋型。
py文件”編譯“完的結(jié)果是字節(jié)碼,cpu還是執(zhí)行不了,依然借助Python虛擬機(jī)解釋執(zhí)行。
但放寬了說(shuō),將高級(jí)語(yǔ)言轉(zhuǎn)換為比它低級(jí)的語(yǔ)言再去解釋執(zhí)行(比如將源碼翻譯為字節(jié)碼),也可以稱(chēng)之為編譯過(guò)程的話(huà),那么Python就不僅僅是解釋型的語(yǔ)言
2.python相對(duì)與其他語(yǔ)言有什么優(yōu)點(diǎn)和缺點(diǎn)?
優(yōu)點(diǎn):簡(jiǎn)單、易學(xué)、免費(fèi)、開(kāi)源、可移植性、解釋性、面向?qū)ο?、可拓展性、豐富的庫(kù)、規(guī)范的代碼
缺點(diǎn):運(yùn)行速度、國(guó)內(nèi)市場(chǎng)小、中文資料匱乏、架構(gòu)多
3.Python應(yīng)用場(chǎng)景有哪些
web后端開(kāi)發(fā)、網(wǎng)絡(luò)爬蟲(chóng)與數(shù)據(jù)分析、人工智能等
4.注釋?zhuān)禾岣叽a可讀性
分為單行注釋#? ? ? ? ? ? ? ? 快捷鍵:? ? ctr+/
多行注釋"""? """
5.變量:可用來(lái)存儲(chǔ)數(shù)據(jù),如字符串、數(shù)字等,可復(fù)用
每一個(gè)變量都存儲(chǔ)這一種類(lèi)型的數(shù)據(jù),該數(shù)據(jù)的類(lèi)型就是該變量的類(lèi)型
6.標(biāo)示符可以理解成是一套命名規(guī)則
常見(jiàn)的標(biāo)示符的命名規(guī)則: 大駝峰命名法、小駝峰命名法,下劃線(xiàn)連接命名法
7.格式化是指將數(shù)據(jù)按照預(yù)先定義好的格式處理數(shù)據(jù)的結(jié)構(gòu)
格式化輸出可以讓開(kāi)發(fā)者很方便的處理數(shù)據(jù)的,組裝數(shù)據(jù),然后將其輸出
8.python交互模式:終端輸入python
linux上通過(guò)vi、sublime、gedit等編輯器實(shí)現(xiàn),文件后綴,py
9.注釋單行#
多行
"""
注釋內(nèi)容? ? ? ?
"""
10.變量的命名規(guī)則
? ? ? 1.只能由下劃線(xiàn)、數(shù)字和字母組成
? ? ? 2.不能以數(shù)字開(kāi)頭
? ? ? 3.不能與關(guān)鍵字同名
? ? ? 4.應(yīng)盡量避免與引用到的函數(shù)或庫(kù)同名
注意,通過(guò)以下命令可以查看?Python?中的關(guān)鍵字
import keyword
print(keyword.kwlist)
# 判斷是不是關(guān)鍵字
print(keyword.iskeyword('None'))
out(1): True
11.python的數(shù)據(jù)類(lèi)型:
數(shù)字型: 整型 (int)
? ? ? ? ? ? 浮點(diǎn)型(float)
? ? ? ? ? ? 布爾型(bool)
真?True?數(shù)學(xué)運(yùn)算時(shí)表示 1
假?False?數(shù)學(xué)運(yùn)算時(shí)表示 0
? ? ? ? ? ? 復(fù)數(shù)型 (complex),基本不用
非數(shù)字型:
? ? ? ? ? ? 字符串
? ? ? ? ? ? 列表
? ? ? ? ? ? 元組
? ? ? ? ? ? 字典
12.進(jìn)入python3交互模式,定義任意個(gè)變量,使用并查看其類(lèi)型
>>> name="杜錦航"
>>> type(name)
<class 'str'>
>>>
13.大駝峰:
MyName="杜錦航"
小駝峰:
myName="杜錦航"
14.int(x) ? ? ? ? 將x轉(zhuǎn)換為一個(gè)整數(shù) ? ?
long(x ) ? ? ? ?將x轉(zhuǎn)換為一個(gè)長(zhǎng)整數(shù) ? ?
float(x ) ? ? ? ? ? ? ? 將x轉(zhuǎn)換到一個(gè)浮點(diǎn)數(shù) ? ?
complex(real [,imag ]) ?創(chuàng)建一個(gè)復(fù)數(shù) ? ?
str(x ) ? ? ? ? ? ? ? ? 將對(duì)象 x 轉(zhuǎn)換為字符串 ? ?
repr(x ) ? ? ? ? ? ? ? ?將對(duì)象 x 轉(zhuǎn)換為表達(dá)式字符串 ? ?
eval(str ) ? ? ? ? ? ? ?用來(lái)計(jì)算在字符串中的有效Python表達(dá)式,并返回一個(gè)對(duì)象 ? ?
tuple(s ) ? ? ? ? ? ? ? 將序列 s 轉(zhuǎn)換為一個(gè)元組 ? ?
list(s ) ? ? ? ? ? ? ? ?將序列 s 轉(zhuǎn)換為一個(gè)列表 ? ?
chr(x ) ? ? ? ? ? ? ? ? 將一個(gè)整數(shù)轉(zhuǎn)換為一個(gè)字符 ? ?
unichr(x ) ? ? ? ? ? ? ?將一個(gè)整數(shù)轉(zhuǎn)換為Unicode字符 ? ?
ord(x ) ? ? ? ? ? ? ? ? 將一個(gè)字符轉(zhuǎn)換為它的整數(shù)值 ? ?
hex(x ) ? ? ? ? ? ? ? ? 將一個(gè)整數(shù)轉(zhuǎn)換為一個(gè)十六進(jìn)制字符串 ? ?
oct(x ) ? ? ? ? ? ? ? ? 將一個(gè)整數(shù)轉(zhuǎn)換為一個(gè)八進(jìn)制字符串 ??
15. 取商://
取余:%
16.>>> print(name)
杜錦航
>>> age=18
>>> height=173.00
>>> print("name is %s,age is %d,height is %.2f"%(name,age.height)
... )
Traceback (most recent call last):
? File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'height'
>>> print("name is %s,age is %d,height is %.02f"%(name,age.height)
... print("name is %s,age is %d,height is %.02f"%(name,age.height))
? File "<stdin>", line 2
? ? print("name is %s,age is %d,height is %.02f"%(name,age.height))
? ? ? ? ^
SyntaxError: invalid syntax
>>> print("name is %s,age is %d,height is %.02f"%(name,age.height))
Traceback (most recent call last):
? File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'height'
>>> print(height)
173.0
>>> print("name is %s,age is %d,height is %2f"%(name,age.height))
Traceback (most recent call last):
? File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'height'
>>> print("name is %s,age is %d,height is %f"%(name,age.height))
Traceback (most recent call last):
? File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'height'
>>> print("name is %s,age is %d,height is %f"%(name,age,height))
name is 杜錦航,age is 18,height is 173.000000
>>>
打錯(cuò)符號(hào),,,,,,,查了半天
17.
"""
編寫(xiě)一個(gè)cart.py(打印名片)程序
運(yùn)行程序后,分別輸入姓名、性別、年齡、單位、聯(lián)系方式等數(shù)據(jù),并用變量分別接收
輸入完成后,最后打印出姓名、性別、年齡、單位、聯(lián)系方式等信息,輸出的格式自行設(shè)定,盡量美觀
輸出需使用上格式化輸出
"""
name = input('請(qǐng)輸入姓名')
company = input('請(qǐng)輸入公司')
title = input('請(qǐng)輸入職位')
phone = input('請(qǐng)輸入電話(huà)')
email = input('請(qǐng)輸入郵箱')
print(company)
print("*" * 30)
print("姓名:%s" % name)
print("職位:%s" % title)
print("聯(lián)系電話(huà):%s" % phone)
print("郵箱:%s" % email)
print("*" * 30)
結(jié)果:
F:\python\python.exe F:/pycharm/project/day01/cart.py
請(qǐng)輸入姓名杜錦航
請(qǐng)輸入公司宇通
請(qǐng)輸入職位液壓工程師
請(qǐng)輸入電話(huà)15734039106
請(qǐng)輸入郵箱15734039106@163.com
宇通
******************************
姓名:杜錦航
職位:液壓工程師
聯(lián)系電話(huà):15734039106
郵箱:15734039106@163.com
******************************
DAY03 條件語(yǔ)句
1.# 練習(xí): 定義一個(gè)整數(shù)變量 age,編寫(xiě)代碼判斷年齡是否正確,要求人的年齡在 0-120 之間
age = 19
if age >= 0 and age <= 120:
? ? print("1")
else:
? ? print("2")
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!注意符號(hào)和字母必須英文格式輸入!!!!!!!!!!!!!!!!!!!!!!!!!
2.random()函數(shù)
import random
import string
# 隨機(jī)整數(shù):
print random.randint(1,50)
# 隨機(jī)選取0到100間的偶數(shù):
print random.randrange(0, 101, 2)
# 隨機(jī)浮點(diǎn)數(shù):
print random.random()
print random.uniform(1, 10)
# 隨機(jī)字符:
print random.choice('abcdefghijklmnopqrstuvwxyz!@#$%^&*()')
# 多個(gè)字符中生成指定數(shù)量的隨機(jī)字符:
print random.sample('zyxwvutsrqponmlkjihgfedcba',5)
# 從a-zA-Z0-9生成指定數(shù)量的隨機(jī)字符:
ran_str = ''.join(random.sample(string.ascii_letters + string.digits, 8))
print ran_str
# 多個(gè)字符中選取指定數(shù)量的字符組成新字符串:
print ''.join(random.sample(['z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'], 5))
# 隨機(jī)選取字符串:
print random.choice(['剪刀', '石頭', '布'])
# 打亂排序
items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print random.shuffle(items)
注意:輸出需要print,試了好幾次,忘了print,還納悶怎么不出來(lái)隨機(jī)數(shù)
DAY04 循環(huán)語(yǔ)句
1.
#!/usr/bin/python
# 定義一個(gè)行變量
row = 1
while row <= 5:
? ? print("*"*row)
? ? row += 1
2.在默認(rèn)情況下,print?函數(shù)輸出內(nèi)容之后,會(huì)自動(dòng)在內(nèi)容末尾增加換行
如果不希望末尾增加換行,可以在?print?函數(shù)輸出內(nèi)容的后面增加?, end=""
其中?""?中間可以指定?print?函數(shù)輸出內(nèi)容之后,繼續(xù)希望顯示的內(nèi)容
語(yǔ)法格式如下:
# 向控制臺(tái)輸出內(nèi)容結(jié)束之后,不會(huì)換行
print("*", end="")
# 單純的換行
print("")
故,序號(hào)1也可:
#!/usr/bin/python
# 在控制臺(tái)連續(xù)輸出五行 *,每一行星號(hào)的數(shù)量依次遞增
row = 1
while row <= 5:
? ? rol = 1
? ? while rol <= row:
? ? ? ? print("*",end="")
? ? ? ? rol += 1
? ? print("")
? ? row += 1
結(jié)果為:
F:\python\python.exe F:/pycharm/project/day01/XingXing.py
*
**
***
****
*****
3.九九乘法表
轉(zhuǎn)義字符 描述
\ 反斜杠符號(hào)
\' 單引號(hào)
\" 雙引號(hào)
\n 換行
\t 橫向制表符
\r 回車(chē)
#!/usr/bin/python
# 在控制臺(tái)連續(xù)輸出五行 *,每一行星號(hào)的數(shù)量依次遞增,把*換成行列相乘
row = 1
while row <= 9:
? ? rol = 1
? ? while rol <= row:
? ? ? ? print(("%d*%d=%d")%(rol,row,row*rol),end="\t")? ? ? ?#不換行? ? ? ? ?\t 對(duì)齊
? ? print("")? ? ? ? #手動(dòng)換行
? ? row += 1
結(jié)果:
F:\python\python.exe F:/pycharm/project/day01/XingXing.py
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
Process finished with exit code 0
4.運(yùn)算符
運(yùn)算符 描述 ? ? ? ? ? ? ? ? 實(shí)例
= 簡(jiǎn)單的賦值運(yùn)算符 ? ? c = a + b 將 a + b 的運(yùn)算結(jié)果賦值為 c
+= 加法賦值運(yùn)算符 ? ? c += a 等效于 c = c + a
-= 減法賦值運(yùn)算符 ? ? c -= a 等效于 c = c - a
*= 乘法賦值運(yùn)算符 ? ? c *= a 等效于 c = c* a
/= 除法賦值運(yùn)算符 ? ? c /= a 等效于 c = c / a
//= 取整除賦值運(yùn)算符 ? ? c //= a 等效于 c = c // a
%= 取 模 (余數(shù))賦值運(yùn)算符 c %= a 等效于 c = c % a
**= 冪賦值運(yùn)算符 ? ? ? ? ? ? c **= a 等效于 c = c** a
運(yùn)算符優(yōu)先級(jí)
運(yùn)算符 ? ? ? ? ? ? ? ? ? ? ? ? 描述
** ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 冪 (最高優(yōu)先級(jí))
* / % // ? ? ? ? ? ? ? ? ? ? ? ? 乘、除、取余數(shù)、取整除
+ - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 加法、減法
<= < > >= ? ? ? ? ? ? ? ? ? ? ? ? 比較運(yùn)算符
== != ? ? ? ? ? ? ? ? ? ? ? ? 等于運(yùn)算符
= %= /= //= -= += = *= 賦值運(yùn)算符
not or and ? ? ? ? ? ? ? ? 邏輯運(yùn)算符
DAY05 列表、元祖
1.
列表用?[]?定義,數(shù)據(jù)?之間使用?,?分隔
例:a=[2,4,5]
b=['data','frog','python']
for 實(shí)現(xiàn)列表的遍歷
例如:
for name in name_list:
? ? 循環(huán)內(nèi)部針對(duì)列表元素進(jìn)行操作
? ? print(name)
2.
測(cè)量列表中元素的個(gè)數(shù)? len()
獲取列表的某個(gè)元素? ? ?
列表[索引] 向列表中添加元素? ? ? ?append() 、 extend() 、 insert()
如何刪除列表中的某個(gè)元素??del pop() remove()
如何修改列表中的某個(gè)元素? 直接根據(jù)索引來(lái)修改?列表[要修改的元素的索引] = 值
如何去查找列表中某個(gè)元素所對(duì)應(yīng)的下標(biāo)? 列表.index(元素)
升序排列:列表名.sort()
降序排列:列表名.sort(reverse=True)
3.
元組用?()?定義
例如:
a=(2,4,5)
b=('data','frog','python')
查詢(xún):
元組[索引] ? ? ? ? 根據(jù)索引取值,索引不存在會(huì)報(bào)錯(cuò)
元組.index(數(shù)據(jù)) 根據(jù)值查詢(xún)索引,返回首次出現(xiàn)時(shí)的索引,沒(méi)有查到會(huì)報(bào)錯(cuò)
元組.count(數(shù)據(jù)) 數(shù)據(jù)在元組中出現(xiàn)的次數(shù)
len(列表) ? ? ? ? ? ? ? ? 元組長(zhǎng)度
if 數(shù)據(jù) in 元組: ? ? ? ? 檢查元組中是否包含某元素
4.
使用?list?函數(shù)可以把元組轉(zhuǎn)換成列表? ? ? ? ? list(元組)
使用?tuple?函數(shù)可以把列表轉(zhuǎn)換成元組? ? ? tuple(列表)
5.
# 編寫(xiě)代碼設(shè)計(jì)簡(jiǎn)易計(jì)算器,可以進(jìn)行基本的加減乘除運(yùn)算。
num1 = int(input("請(qǐng)輸入第一個(gè)數(shù)字:"))
symbol = input("請(qǐng)輸入運(yùn)算符")
num2 = int(input("請(qǐng)輸入第二個(gè)數(shù)字:"))
if symbol == "+":
? ? print("%d+%d=%d"%(num1,num2,num1*num2))
elif symbol == "-":
? ? print("%d-%d=%d"%(num1,num2,num1-num2))
elif symbol == "*":
? ? print("%d*%d=%d"%(num1,num2,num1*num2))
elif symbol == "/":
? ? print("%d/%d=%d"%(num1,num2,num1/num2))
else:
? ? print("請(qǐng)輸入正確的運(yùn)算符")
結(jié)果:
F:\python\python.exe F:/pycharm/project/day05/高級(jí)變量.py
請(qǐng)輸入第一個(gè)數(shù)字:10
請(qǐng)輸入運(yùn)算符/
請(qǐng)輸入第二個(gè)數(shù)字:5
10/5=2
Process finished with exit code 0
6.
# 使用while循環(huán)輸出*
row = 1
while row <= 5:
? ? print("*"*row)
? ? row += 1
結(jié)果:
F:\python\python.exe F:/pycharm/project/day05/xingxing.py
*
**
***
****
*****
DAY06 字典
1.字典用?{key:value,...}?定義
例如:xiaoming = {"name": "小明",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "age": 18,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "gender": True,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "height": 1.75}
常用操作:
序號(hào)分類(lèi)關(guān)鍵字 / 函數(shù) / 方法說(shuō)明
? ? ?1增加字典[鍵] = 數(shù)據(jù)鍵不存在,會(huì)添加鍵值對(duì);鍵存在,會(huì)修改鍵值對(duì)的值
? ? ?2刪除del 字典[鍵]刪除指定的鍵值對(duì)
? ? ?字典.pop(鍵)刪除指定鍵值對(duì),返回被刪除的值
? ? ?字典.clear清空字典
? ? ?3修改字典[鍵] = 數(shù)據(jù)鍵不存在,會(huì)添加鍵值對(duì);鍵存在,會(huì)修改鍵值對(duì)的值
? ? ?字典.setdefault(鍵,數(shù)據(jù))鍵值對(duì)不存在,添加鍵值對(duì);存在則不做處理
? ? ?字典.update(字典2)取出字典2的鍵值對(duì),鍵值對(duì)不存在,添加鍵值對(duì);存在則修改值
? ? ?4查詢(xún)字典[鍵]根據(jù)鍵取值,鍵值對(duì)不存在會(huì)報(bào)錯(cuò)
? ? ?字典.get(鍵)根據(jù)鍵取值,鍵值對(duì)不存在不會(huì)報(bào)錯(cuò)
? ? ?字典.keys()可進(jìn)行遍歷,獲取所有鍵
? ? ?字典.values()可進(jìn)行遍歷,獲取所有值
? ? ?字典.items()可進(jìn)行遍歷,獲取所有(鍵,值)
2.字典應(yīng)用場(chǎng)景
使用?多個(gè)鍵值對(duì),存儲(chǔ)?描述一個(gè) 物體 的相關(guān)信息?—— 描述更復(fù)雜的數(shù)據(jù)信息
將?多個(gè)字典?放在?一個(gè)列表?中,再進(jìn)行遍歷,在循環(huán)體內(nèi)部針對(duì)每一個(gè)字典進(jìn)行?相同的處理
字典的遍歷:字典.keys()、字典.values()、字典.items()
3.字符串
注意:如果字符串內(nèi)部需要使用?",可以使用?'?定義字符串
? ? ? ? ? 如果字符串內(nèi)部需要使用?',可以使用?"?定義字符串
? ? ? ? ? 可以使用 索引 獲取一個(gè)字符串中 指定位置的字符,索引計(jì)數(shù)從 0 開(kāi)始
? ? ? ? ? 也可以使用 for 循環(huán)遍歷 字符串中每一個(gè)字符
例:
string = "Hello Python"
for c in string:
? ? print(c, end="")
結(jié)果:
Hello Python
常用操作;
判斷
方法說(shuō)明
string.isalpha()如果 string 至少有一個(gè)字符并且所有字符都是字母則返回 True
string.isdecimal()如果 string 只包含數(shù)字則返回 True
string.islower()如果 string 中包含至少一個(gè)區(qū)分大小寫(xiě)的字符,并且所有這些(區(qū)分大小寫(xiě)的)字符都是小寫(xiě),則返回 True
string.isupper()如果 string 中包含至少一個(gè)區(qū)分大小寫(xiě)的字符,并且所有這些(區(qū)分大小寫(xiě)的)字符都是大寫(xiě),則返回 True
string.startswith(str)檢查字符串是否是以 str 開(kāi)頭,是則返回 True
string.endswith(str)檢查字符串是否是以 str 結(jié)束,是則返回 True
查找和替換
方法說(shuō)明
string.find(str, start=0, end=len(string))檢測(cè) str 是否包含在 string 中,如果 start 和 end 指定范圍,則檢查是否包含在指定范圍內(nèi),如果是返回開(kāi)始的索引值,否則返回?-1
string.rfind(str, start=0, end=len(string))類(lèi)似于 find(),不過(guò)是從右邊開(kāi)始查找
string.index(str, start=0, end=len(string))跟 find() 方法類(lèi)似,不過(guò)如果 str 不在 string 會(huì)報(bào)錯(cuò)
string.rindex(str, start=0, end=len(string))類(lèi)似于 index(),不過(guò)是從右邊開(kāi)始
string.replace(old_str, new_str, num=string.count(old))返回一個(gè)新字符串,把 string 中的 old_str 替換成 new_str,如果 num 指定,則替換不超過(guò) num 次
拆分和連接
方法說(shuō)明
string.partition(str)返回元組,把字符串 string 分成一個(gè) 3 元素的元組 (str前面, str, str后面)
string.rpartition(str)類(lèi)似于 partition() 方法,不過(guò)是從右邊開(kāi)始查找
string.split(str="", num)返回列表,以 str 為分隔符拆分 string,如果 num 有指定值,則僅分隔 num + 1 個(gè)子字符串,str 默認(rèn)包含 '\r', '\t', '\n' 和空格
string.splitlines()返回列表,按照行('\r', '\n', '\r\n')分隔
string1 + string2拼接兩個(gè)字符串
string.join(seq)返回字符串,以 string 作為分隔符,將 seq 中所有的元素(的字符串表示)合并為一個(gè)新的字符串
大小寫(xiě)轉(zhuǎn)換
方法說(shuō)明
string.lower()返回新字符串,轉(zhuǎn)換 string 中所有大寫(xiě)字符為小寫(xiě)
string.upper()返回新字符串,轉(zhuǎn)換 string 中的小寫(xiě)字母為大寫(xiě)
文本對(duì)齊
方法說(shuō)明
string.ljust(width)返回新字符串,基于原字符串左對(duì)齊,并使用空格填充至長(zhǎng)度 width
string.rjust(width)返回新字符串,基于原字符串右對(duì)齊,并使用空格填充至長(zhǎng)度 width
string.center(width)返回新字符串,基于原字符串居中,并使用空格填充至長(zhǎng)度 width
去除空白字符
方法說(shuō)明
string.lstrip()返回新字符串,截掉 string 左邊(開(kāi)始)的空白字符
string.rstrip()返回新字符串,截掉 string 右邊(末尾)的空白字符
string.strip()返回新字符串,截掉 string 左右兩邊的空白字符
4.切片
切片方法適用于字符串、列表、元組
字符串[開(kāi)始索引:結(jié)束索引:步長(zhǎng)]
注意:指定的區(qū)間屬于左閉右開(kāi)型 [開(kāi)始索引, 結(jié)束索引) 對(duì)應(yīng)
開(kāi)始索引 <= 范圍 < 結(jié)束索引
從頭開(kāi)始,開(kāi)始索引 數(shù)字可以省略,冒號(hào)不能省略
到末尾結(jié)束,結(jié)束索引 數(shù)字和冒號(hào)都可以省略
步長(zhǎng)默認(rèn)為 1,如果元素連續(xù),數(shù)字和冒號(hào)都可以省略
例如:
截取從 2 ~ 5 位置 的字符串
截取從 2 ~ 末尾 的字符串
截取從 開(kāi)始 ~ 5 位置 的字符串
截取完整的字符串
從開(kāi)始位置,每隔一個(gè)字符截取字符串
從索引 1 開(kāi)始,每隔一個(gè)取一個(gè)
截取從 2 ~ 末尾 - 1 的字符串
截取字符串末尾兩個(gè)字符
字符串的逆序(面試題)
答案:
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])
5.公用語(yǔ)法
內(nèi)置函數(shù)
函數(shù)描述備注
len(item)計(jì)算容器中元素個(gè)數(shù)
del(item)刪除變量del 有兩種方式
max(item)返回容器中元素最大值如果是字典,只針對(duì) key 比較
min(item)返回容器中元素最小值如果是字典,只針對(duì) key 比較
注意:字符串?比較符合以下規(guī)則: "0" < "A" < "a"
切片
描述Python 表達(dá)式結(jié)果支持的數(shù)據(jù)類(lèi)型
切片"0123456789"[::-2]"97531"字符串、列表、元組
運(yùn)算符
運(yùn)算符Python 表達(dá)式結(jié)果描述支持的數(shù)據(jù)類(lèi)型
+[1, 2] + [3, 4][1, 2, 3, 4]合并字符串、列表、元組
*["Hi!"] * 4['Hi!', 'Hi!', 'Hi!', 'Hi!']重復(fù)字符串、列表、元組
in3 in (1, 2, 3)True元素是否存在字符串、列表、元組、字典
not in4 not in (1, 2, 3)True元素是否不存在字符串、列表、元組、字典
> >= == < <=(1, 2, 3) < (2, 2, 3)True元素比較字符串、列表、元組
注意:
in 在對(duì) 字典 操作時(shí),判斷的是 字典的鍵
in 和 not in 被稱(chēng)為 成員運(yùn)算符
完整for循環(huán)語(yǔ)法
for 變量 in 集合:
? ? 循環(huán)體代碼
else:
? ? 沒(méi)有通過(guò) break 退出循環(huán),循環(huán)結(jié)束后,會(huì)執(zhí)行的代碼
例子:
students = [
? ? {"name": "阿土",
? ? "age": 20,
? ? "gender": True,
? ? "height": 1.7,
? ? "weight": 75.0},
? ? {"name": "小美",
? ? "age": 19,
? ? "gender": False,
? ? "height": 1.6,
? ? "weight": 45.0},
]
find_name = "阿土"
for stu_dict in students:
? ? print(stu_dict)
? ? # 判斷當(dāng)前遍歷的字典中姓名是否為find_name
? ? if stu_dict["name"] == find_name:
? ? ? ? print("找到了")
? ? ? ? # 如果已經(jīng)找到,直接退出循環(huán),就不需要再對(duì)后續(xù)的數(shù)據(jù)進(jìn)行比較
? ? ? ? break
else:
? ? print("沒(méi)有找到")
print("循環(huán)結(jié)束")
結(jié)果:
{'name': '阿土', 'age': 20, 'gender': True, 'height': 1.7, 'weight': 75.0}
找到了
循環(huán)結(jié)束
6.登陸信息存入字典
"""
注冊(cè)的校驗(yàn)程序:
A)實(shí)現(xiàn)循環(huán)從鍵盤(pán)輸入用戶(hù)名和密碼
B)如果用戶(hù)名或者密碼任一一個(gè)輸入的是“QUIT”直接退出程序。
C)判斷用戶(hù)名長(zhǎng)度為6-20,用戶(hù)名開(kāi)頭必須以字母開(kāi)頭。
D)密碼長(zhǎng)度至少6位,不能為純數(shù)字,不能有空格。
E)如果不符合上述規(guī)則、打印出不符合的原因、提示重新輸入。并跳轉(zhuǎn)到用戶(hù)名輸入階段。
F)將正確的用戶(hù)名和密碼存入字典里,并打印校驗(yàn)成功字樣。
"""
user_info = {}
while True:
? ? # 獲取用戶(hù)名和密碼
? ? username = input("input your username:")
? ? password = input('input your password:')
? ? # 如果用戶(hù)名或密碼任意一個(gè)是QUIT 直接退出
? ? if username == 'QUIT' or password == 'quit':
? ? ? ? break
? ? # 判斷用戶(hù)名長(zhǎng)度在6-20
? ? elif len(username) < 6 or len(username) >20:
? ? ? ? print('用戶(hù)名長(zhǎng)度不在6-20范圍內(nèi)')
? ? ? ? break
? ? # 用戶(hù)名開(kāi)頭字母判斷
? ? elif not username[0].isalpha():
? ? ? ? print('用戶(hù)名必須以字母開(kāi)頭')
? ? ? ? break
? ? # 密碼格式判斷
? ? elif len(password) < 6 or password.isdigit() or " " in password:
? ? ? ? print("密碼長(zhǎng)度至少6位,不能為純數(shù)字,不能有空格。")
? ? ? ? break
? ? else:
? ? ? ? user_info[username] = password
? ? print("校驗(yàn)成功")
? ? print(user_info)
結(jié)果為:
input your username:dujinhang
input your password:djh123456
校驗(yàn)成功
{'dujinhang': 'djh123456'}
input your username:zhangsan
input your password:zs123456
校驗(yàn)成功
{'dujinhang': 'djh123456', 'zhangsan': 'zs123456'}
input your username:wangmazi
input your password:wmz123456
校驗(yàn)成功
{'dujinhang': 'djh123456', 'zhangsan': 'zs123456', 'wangmazi': 'wmz123456'}
input your username:wangmaz
input your password:123456
密碼長(zhǎng)度至少6位,不能為純數(shù)字,不能有空格。
注意:更改break位置可以實(shí)現(xiàn)一直循環(huán)輸入,刪除后面3個(gè)break可以實(shí)現(xiàn)一直循環(huán)輸入。刪除后最后新增一個(gè)break可以在正確輸入用戶(hù)名和密碼后結(jié)束
7.登陸
d = {'阿杜': 123456}
while True:
? ? name = input('請(qǐng)輸入您的用戶(hù)名:')
? ? if name in d:
? ? ? ? break
? ? else:
? ? ? ? print('您輸入的用戶(hù)名不存在,請(qǐng)重新輸入')
? ? ? ? continue
count = 5
while count:
? ? password = int(input('請(qǐng)輸入您的密碼:'))
? ? if d[name] == password:
? ? ? ? print('進(jìn)入系統(tǒng)')
? ? ? ? break
? ? else:
? ? ? ? count -= 1
? ? ? ? print('您輸入的密碼不正確,還有{}次輸入機(jī)會(huì)'.format(count))
? ? ? ? continue
請(qǐng)輸入您的用戶(hù)名:阿杜
請(qǐng)輸入您的密碼:12345
您輸入的密碼不正確,還有4次輸入機(jī)會(huì)
請(qǐng)輸入您的密碼:123456
進(jìn)入系統(tǒng)
8.
# 從鍵盤(pán)獲取5個(gè)學(xué)生的名字,然后隨機(jī)抽出一名學(xué)生去打掃衛(wèi)生
import random
name_list = []
i = 0
while i < 5:
? ? name = input('輸入學(xué)生姓名')
? ? name_list.append(name)
? ? i += 1
a = random.randint(0, 4)
print('打掃衛(wèi)生的學(xué)生是%s' % name_list[a])
結(jié)果:
輸入學(xué)生姓名張三
輸入學(xué)生姓名里斯
輸入學(xué)生姓名王麻子
輸入學(xué)生姓名郭達(dá)
輸入學(xué)生姓名杰森
打掃衛(wèi)生的學(xué)生是杰森
注意:循環(huán)體要縮進(jìn),后續(xù)不循環(huán)的記得不要縮進(jìn)!
DAY07 函數(shù)操作
1.定義函數(shù)的格式如下:
def 函數(shù)名():? ? 函數(shù)封裝的代碼
? ? ……
注釋?zhuān)?/p>
在開(kāi)發(fā)中,如果希望給函數(shù)添加注釋?zhuān)瑧?yīng)該在 定義函數(shù)的下方,使用 連續(xù)的三對(duì)引號(hào),這種注釋是給函數(shù)用的,方便給調(diào)用的人知道函數(shù)是怎么用的;
在連續(xù)的三對(duì)引號(hào)之間編寫(xiě)對(duì)函數(shù)的說(shuō)明文字;
在函數(shù)調(diào)用位置,用使用鼠標(biāo)點(diǎn)擊函數(shù)名后,然后使用快捷鍵 CTRL + Q 可以查看函數(shù)的說(shuō)明信息。
2.函數(shù)參數(shù)
形參:定義?函數(shù)時(shí),小括號(hào)中的參數(shù),是給真實(shí)數(shù)據(jù)占位用的,在函數(shù)內(nèi)部?作為變量使用
實(shí)參:調(diào)用?函數(shù)時(shí),小括號(hào)中的參數(shù),是傳遞到?函數(shù)內(nèi)部?的?真實(shí)數(shù)據(jù)
例子:
a = 5
def test1(a):
? ? # 這里 a 是形參,是在函數(shù)內(nèi)部定義的,作用域只在函數(shù)內(nèi)部
? ? a += 1
? ? print("%d" % a)
test1(2)
# 這里因?yàn)樾螀⒌淖饔糜虿坏竭@里,所以這個(gè) a 是外面的 a
print("%d" % a)
結(jié)果:
3
5
注意,函數(shù)內(nèi)部形參最好不要與外部變量同名
3.返回值
在程序開(kāi)發(fā)中,有時(shí)候,會(huì)希望 一個(gè)函數(shù)執(zhí)行結(jié)束后,告訴調(diào)用者一個(gè)結(jié)果,以便調(diào)用者針對(duì)具體的結(jié)果做后續(xù)的處理
在函數(shù)中使用 return 關(guān)鍵字可以返回結(jié)果
調(diào)用函數(shù)一方,可以使用變量來(lái)接收函數(shù)的返回結(jié)果,也可以不接收只調(diào)用。注意沒(méi)有返回值,也有返回值,是 None
注意:return 表示返回,后續(xù)的代碼都不會(huì)被執(zhí)行
例子:
def func_sum():
? ? """求和 1+2"""
? ? sum_num = 1 + 2
? ? print(sum_num)
? ? return
? ? # 這行代碼不會(huì)執(zhí)行了
? ? print('不會(huì)執(zhí)行這行代碼')
res=func_sum()
print(res)
結(jié)果為;
3
None
例2:
# 計(jì)算1~num的累積和
def calculate_num(num):
? ? result = 0
? ? i = 1
? ? while i <= num:
? ? ? ? result = result + i
? ? ? ? i += 1
? ? return result
result = calculate_num(100)
print('1~100的累積和為:%d' % result)
4.函數(shù)的嵌套使用
定義一個(gè)函數(shù)能夠打印 5 行 的分隔線(xiàn),分隔線(xiàn)要求任意符號(hào)任意行數(shù)
def print_line(a, b):
? ? print(a * b)
def print_lines(c, d):
? ? row = 0
? ? while row < 5:
? ? ? ? print_line(c, d)
? ? ? ? row += 1
print_lines("*", 30)
運(yùn)行結(jié)果:
******************************
******************************
******************************
******************************
******************************
練習(xí):
1.
# 設(shè)計(jì)一個(gè)程序,計(jì)算出 0-n 之間所有整數(shù)的和,并將計(jì)算的值返回。
def get_sum_num(n):
? ? i = 0
? ? sum_num = 0
? ? while i <= n:
? ? ? ? sum_num += i
? ? ? ? i += 1
? ? return sum_num
sum_num = get_sum_num(100)
print(sum_num)
注意:函數(shù)定義和循環(huán)體的冒號(hào):
2.
"""
定義一個(gè)函數(shù),要求輸入大于0的數(shù)字n,判斷傳入數(shù)字的奇偶性,如果是奇數(shù)返回 "n是奇數(shù)",否則返回 “n是偶數(shù)”,否則 返回“請(qǐng)輸入大于0的整數(shù)”
"""
def jiou(n):
? ? if n > 0:
? ? ? ? if n/2 == 0:
? ? ? ? ? ? return '%d是偶數(shù)' % n
? ? ? ? else:
? ? ? ? ? ? return '%d是奇數(shù)' % n
? ? else:
? ? ? ? return '請(qǐng)輸入大于零的整數(shù)'
result = jiou(135)
print(result)
結(jié)果:
135是奇數(shù)
3.
"""
編寫(xiě)一個(gè)程序,通過(guò)鍵盤(pán)循環(huán)獲取5個(gè)學(xué)生的信息,將學(xué)生信息組成字典保存到列表中,最終將學(xué)生信息列表打印出來(lái)。(學(xué)生信息包括 name 、age、id)
"""
stu_list = []
stu_dict={}
i = 0
while i < 5:
? ? stu_dict = {}
? ? name = input("請(qǐng)輸入姓名:")
? ? age = input("請(qǐng)輸入年齡:")
? ? id_stu = input("請(qǐng)輸入學(xué)號(hào):")
? ? stu_dict["name"] = name
? ? stu_dict["age"] = age
? ? stu_dict["id"] = id_stu
? ? stu_list.append(stu_dict)
? ? i += 1
print(stu_list)
運(yùn)行結(jié)果:
請(qǐng)輸入姓名:張三
請(qǐng)輸入年齡:12
請(qǐng)輸入學(xué)號(hào):123456
請(qǐng)輸入姓名:李四
請(qǐng)輸入年齡:23
請(qǐng)輸入學(xué)號(hào):234567
請(qǐng)輸入姓名:王五
請(qǐng)輸入年齡:34
請(qǐng)輸入學(xué)號(hào):456789
請(qǐng)輸入姓名:周六
請(qǐng)輸入年齡:45
請(qǐng)輸入學(xué)號(hào):567891
請(qǐng)輸入姓名:劉七
請(qǐng)輸入年齡:56
請(qǐng)輸入學(xué)號(hào):678912
[{'name': '張三', 'age': '12', 'id': '123456'}, {'name': '李四', 'age': '23', 'id': '234567'}, {'name': '王五', 'age': '34', 'id': '456789'}, {'name': '周六', 'age': '45', 'id': '567891'}, {'name': '劉七', 'age': '56', 'id': '678912'}]
DAY08 模塊和匿名函數(shù)
1.模塊
模塊是 Python 程序架構(gòu)的一個(gè)核心概念
模塊就好比是 工具包,要想使用這個(gè)工具包中的工具,就需要導(dǎo)入 import 這個(gè)模塊
每一個(gè)以擴(kuò)展名 py 結(jié)尾的 Python 源代碼文件都是一個(gè)模塊
在模塊中定義的 全局變量、函數(shù)都是模塊能夠提供給外界直接使用的工具
例子:
新建 info.py,代碼如下
name = "datafrog"
def func():
? ? print('info_func')
再新建 get_info.py 文件,并且編寫(xiě)以下代碼:
import info
print(info.name)
info.func()
2.列表推導(dǎo)式:輕量級(jí)循環(huán)創(chuàng)建列表
例子:
a=[x for x in range(1,7) if x%2==0]
b=[x for x in range(1,7) if x%2!=0]
c=[x for x in range(1,7,2)]
print(a)
print(b)
print(c)
注意:第一個(gè)x可以是含x的參數(shù)
例2
d=[(x,y) for x in range(1,4) for y in range(3,5)]
輸出結(jié)果:
[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]
3.匿名函數(shù):用lambda關(guān)鍵詞能創(chuàng)建小型匿名函數(shù)。這種函數(shù)得名于省略了用def聲明函數(shù)的標(biāo)準(zhǔn)步驟
例:
sum = lambda arg1, arg2: arg1 + arg2
# 調(diào)用sum函數(shù)
print("Value of total : %s" % sum( 10, 20 ))
print("Value of total : %s" % sum( 20, 20 ))
以上實(shí)例輸出結(jié)果:
Value of total :? 30
Value of total :? 40
例2:
下面的數(shù)據(jù)如何指定按age或name排序?
stus = [
? ? {"name": "zhangsan", "age": 18},
? ? {"name": "lisi", "age": 19},
? ? {"name": "wangwu", "age": 17}
]
按name排序:
stus.sort(key = lambda x: x['name'])
print(stus)
輸出結(jié)果:
[{'age': 19, 'name': 'lisi'}, {'age': 17, 'name': 'wangwu'}, {'age': 18, 'name': 'zhangsan'}]
按age排序:
stus.sort(key = lambda x: x['age'])
print(stus)
輸出結(jié)果:
[{'age': 17, 'name': 'wangwu'}, {'age': 18, 'name': 'zhangsan'}, {'age': 19, 'name': 'lisi'}
DAY09 函數(shù)高級(jí)
1.局部變量、全局變量
局部:函數(shù)內(nèi)部定義
全局:函數(shù)外部定義
如果在函數(shù)中修改全局變量,那么就需要使用global進(jìn)行聲明,否則出錯(cuò)
例子:
a = 10
def test():
? ? global a
? ? a = 5? # 修改全局變量
? ? print("函數(shù)內(nèi)a:%d" %a)
test()
print("函數(shù)外a:%d" %a)
運(yùn)行結(jié)果:
函數(shù)內(nèi)a:5
函數(shù)外a:5
2.函數(shù)返回值
例子:
def func2():
? ? return 1, 1.5
a = func2()
print(a)
a, b = func2()
print(a)
print(b)
a, b, c = 2, 2.5, "hello"
print(a)
print(b)
print(c)
結(jié)果 :
(1, 1.5)
1
1.5
2
2.5
hello
3.函數(shù)參數(shù)
默認(rèn)參數(shù):調(diào)用函數(shù)時(shí),如果沒(méi)有傳入默認(rèn)參數(shù)對(duì)應(yīng)的實(shí)參,則實(shí)參使用默認(rèn)值。
關(guān)鍵字參數(shù):調(diào)用函數(shù)時(shí),實(shí)參可以指定對(duì)應(yīng)的形參,稱(chēng)為關(guān)鍵字參數(shù)
例子:
def printinfo(name, age):
? # 打印任何傳入的字符串
? print("Name: %s"% name)
? print("Age: %s"% age)
printinfo(age=9,name="miki" )
結(jié)果:
Name: miki
Age: 9
可變參數(shù)
(1)、元祖:args
函數(shù)可以定義 可變參數(shù),用于接收任意數(shù)量的參數(shù)
可變參數(shù)的前邊需要添加*,用于提示python解釋器該參數(shù)為可變參數(shù)
使用可變參數(shù)直接用args即可(不需要加*)
可變參數(shù)的本質(zhì)是 將傳遞的參數(shù)包裝成了元組
(2)、字典:kwargs
可變參數(shù)還有一種形式 可以接收不存在的關(guān)鍵字參數(shù)
定義參數(shù)時(shí)需要在變量名前添加兩個(gè)*
這種可變參數(shù)會(huì)將 不存在的關(guān)鍵字參數(shù)包裝成字典
例子:
def sum_num(a, b, *args, **kwargs):
? ? print(a)
? ? print(b)
? ? print(args)
? ? print(kwargs)
? ? test(*args, **kwargs)
def test(*args, **kwargs):
? ? print(args)
? ? print(kwargs)
sum_num(1, 2, 3, mm=5, nn=6)
結(jié)果為:
1
2
(3,)
{'mm': 5, 'nn': 6}
(3,)
{'mm': 5, 'nn': 6}
例2:
#計(jì)算n到m的和,調(diào)用時(shí)可以不傳,或傳遞1個(gè)或傳遞兩個(gè)參數(shù),默認(rèn)計(jì)算1-100的和
def func3(n=1, m=100):
? ? i = n
? ? sum = 0
? ? while i <= m:
? ? ? ? sum += i
? ? ? ? i += 1
? ? return sum
print(func3(2, 5))
結(jié)果:
14
例3:#除法
def div(a, b, *args):
? ? # 如果b=0,就讓結(jié)果為a
? ? if b == 0:
? ? ? ? ret = a
? ? else:
? ? ? ? ret = a / b
? ? ? ? if args:
? ? ? ? ? ? for i in args:
? ? ? ? ? ? ? ? if i == 0:
? ? ? ? ? ? ? ? ? ? # 如果i=0,就跳過(guò)
? ? ? ? ? ? ? ? ? ? continue
? ? ? ? ? ? ? ? ret = ret / i
? ? return ret
print(div(50, 2, 4))
例4:
# 使用不定長(zhǎng)參數(shù)定義一個(gè)函數(shù)max_min,接受的參數(shù)類(lèi)型是數(shù)值,最終返回這些數(shù)中的最大值和最小值
def max_min(*args):
? ? if len(args) == 0:
? ? ? ? return 0, 0
? ? elif len(args) == 1:
? ? ? ? return args(0), args(0)
? ? else:
? ? ? ? max = args[0]
? ? ? ? min = args[0]
? ? ? ? for i in args:
? ? ? ? ? ? if max < i:
? ? ? ? ? ? ? ? max = i
? ? ? ? ? ? if min > i:
? ? ? ? ? ? ? ? min = i
? ? ? ? return max, min
print(max_min(1,2,5,6,8,5,25,))
例5:
# 定義一個(gè)函數(shù),返回n的階乘的最后結(jié)果,并打印出如5階乘"5!=120"的效果
def num_factorial(a):
? ? ret = 1
? ? for i in range(a):
? ? ? ? ret = ret * (i + 1)
? ? print("%d!=%d" % (a, ret))
num_factorial(5)
例6
# 定義一個(gè)函數(shù),返回由n(包含n)以?xún)?nèi)的奇數(shù)或者偶數(shù)組成的列表,默認(rèn)返回全是奇數(shù)的列表
def jiou(n, type="jishu"):
? ? res = []
? ? if type == "jishu":
? ? ? ? for i in range(1, n + 1):
? ? ? ? ? ? if i % 2 != 0:
? ? ? ? ? ? ? ? res.append(i)
? ? if type == "oushu":
? ? ? ? for i in range(i, n + 1):
? ? ? ? ? ? if i % 2 == 0:
? ? ? ? ? ? ? ? res.append(i)
? ? return res
print(jiou(15))
運(yùn)行結(jié)果
[1, 3, 5, 7, 9, 11, 13, 15]
例7:
"""
定義函數(shù)findall,實(shí)現(xiàn)對(duì)字符串find方法的進(jìn)一步封裝,要求返回符合要求的所有位置的起始下標(biāo),
如字符串"helloworldhellopythonhelloc++hellojava",需要找出里面所有的"hello"的位置,
最后將返回一個(gè)元組(0,10,21,29),即將h的下標(biāo)全部返回出來(lái),而find方法只能返回第一個(gè)
"""
def find_all(str1, date, start, end):
? ? list1 = []
? ? while start <= end:
? ? ? ? i = str1.find(date, start, end)
? ? ? ? if i == -1:
? ? ? ? ? ? break
? ? ? ? else:
? ? ? ? ? ? start = i + 1
? ? ? ? ? ? list1.append(i)
? ? return tuple(list1)? ? ? ? ? ? ? ? ? ? ? #元祖形式輸出
str1 = "helloworldhellopythonhelloc++hellojava"
date = "hello"
end = len(str1)
print(find_all(str1, date, 0, end))
運(yùn)行結(jié)果
(0, 10, 21, 29)