第五章 条件、循环及其他语句
第五章 條件、循環及其他語句
再談print和import
print現在實際上是一個函數
1,打印多個參數
用逗號分隔,打印多個表達式
sep自定義分隔符,默認空格
end自定義結束字符串,默認換行
2,導入時重命名as
導入整個模塊并給它指定別名
import math as beyond beyond.sqrt(4)#結果為:2.0導入特定函數并給它指定別名
from math import sqrt as beyond beyond(4)#結果為:2.0賦值魔法
1,序列解包
序列解包(或可迭代對象解包):將一個序列(或任何可迭代對象)解包,并將得到的值存儲到一系列變量中
#可同時(并行)給多個變量賦值 x, y, z = 1, 2, 3 print(x,y,z,sep="-")#結果為:1-2-3#交換多個變量的值 x, y = y, x print(x,y,z,sep=",")#結果為:2,1,3 beyond = 1,2,3 beyond#結果為:(1, 2, 3) x,y,z = beyond x#結果為:1 y#結果為:2 z#結果為:3假設要從字典中隨便獲取(或刪除)一個鍵-值對,可使用方法popitem,隨便獲取一個鍵-值對并以元組的方式返回,接下來,可直接將返回的元組解包到兩個變量中
beyond ={"name":"huangjiaju","age":31} key,value = beyond.popitem() key#結果為:name value#結果為:huangjiaju左右兩邊列出的目標個數必須相同,否則會報異常
可使用星號運算符(*)來收集多余的值,這樣無需確保值和變量的個數相同
帶星號的變量最終包含的總是一個列表
2,鏈式賦值
將多個變量關聯到同一個值
x = y = beyond()等價于 y = beyond() x = y不等價!!! x = beyond() y = beyond()3,增強賦值
將右邊表達式中的運算符移到賦值運算符的前面
x = 2 x += 1 x#結果為:3 x *= 2 x#結果為:6yy = "beyond" yy += "huangjiaju" yy#結果為:'beyondhuangjiaju' yy *= 2 yy#結果為:'beyondhuangjiajubeyondhuangjiaju'代碼塊:縮進的樂趣
代碼塊其實并不是一種語句,代碼塊是一組語句,代碼塊是通過縮進代碼(即在前面加空格)來創建的
在Python中,使用冒號(:)指出接下來是一個代碼塊
條件和條件語句
1,布爾值
假(0):False None 0 "" () [] {},其他則為真(1)
雖然[]和""都為假,但它們并不相等(即[] != "")
布爾值True和False屬于類型bool
于任何值都可用作布爾值
2,有條件的執行和if語句
如果條件(if和冒號之間的表達式)為前面定義的真,就執行后續代碼塊(這里是一條print語句);如果條件為假,就不執行
name = input('What is your name? ') if name.endswith('beyond'): #以beyond結尾的名字為真print('Hello, Mr. beyond') name = input('What is your name?') if name.endswith('yanyu'): #以yanyu結尾的名字為真print('Hello, Mr. yanyu') else: print('Hello, stranger')3,else子句
條件表達式——C語言中三目運算符的Python版本
"語句1" if 條件 else "語句2"如果條件為真,則執行語句1,否則執行語句2
4,elif 子句
要檢查多個條件,可使用elif,elif是else if的縮寫
num = int(input('Enter a number: ')) if num > 0: print('The number is positive') elif num < 0: print('The number is negative') else: print('The number is zero')5,代碼塊嵌套
name = input('What is your name? ') if name.endswith('Gumby'): #以Gumby結尾都為真if name.startswith('Mr.'): #以Mr.開始都為真print('Hello, Mr. Gumby') elif name.startswith('Mrs.'): print('Hello, Mrs. Gumby') else: print('Hello, Gumby') else: print('Hello, stranger')6,更復雜的條件
1,比較運算符
在條件表達式中,最基本的運算符可能是比較運算符,它們用于執行比較
| x == y | x等于y |
| x < y | x小于y |
| x > y | x大于y |
| x >= y | x大于或等于y |
| x <= y | x小于或等于y |
| x != y | x不等于y |
| x is y | x和y是同一個對象 |
| x is not y | x和y是不同的對象 |
| x in y | x是容器(如序列)y的成員 |
| x not in y | x不是容器(如序列)y的成員 |
1,相等運算符
比較運算符,用兩個等號(==)表示
一個等號是賦值運算符,用于修改值
2,is:相同運算符
''' 變量x和y指向同一個列表 而z指向另一個列表(其中包含的值以及這些值的排列順序都與前一個列表相同) ''' x = y = [1, 2, 3] z = [1, 2, 3] x == y #結果為:True x == z #結果為:True x is y #結果為:True x is z #結果為:False==用來檢查兩個對象是否相等
is用來檢查兩個對象是否相同(是同一個對象)
3,in:成員資格運算符
name = input('What is your name?') if 's' in name:print('Your name contains the letter "s".') else: print('Your name does not contain the letter "s".')4,字符串和序列的比較
根據字符的字母排列順序進行比較的
"alpha" < "beta"#結果為:True要獲悉字母的順序值,可使用函數ord
這個函數的作用與函數chr相反
可使用字符串方法lower對設計大寫字母的字符串進行比較
"a".lower() < "B".lower()#結果為:True 'FnOrD'.lower() == 'Fnord'.lower()#結果為:True[1, 2] < [2, 1]#結果為:True [2, [1, 4]] < [2, [1, 5]]#結果為:True2,布爾運算符
讀取一個數,并檢查這個數是否位于1~10(含)
number = int(input('Enter a number between 1 and 10: ')) if number <= 10 and number >= 1: print('Great!') else: print('Wrong!')運算符and是一個布爾運算符,還有另外兩個布爾運算符:or和not
布爾運算符有個有趣的特征:只做必要的計算
7,斷言
使用關鍵字assert,要求某些條件得到滿足
assert語句充當檢查點
循環
1,while 循環
打印1-100
x = 1 while x <= 100: print(x) x += 1 name = '' while not name: name = input('Please enter your name: ') print('Hello, {}!'.format(name))2,for 循環
可迭代對象是可使用for循環進行遍歷的對象
words = ['this', 'is', 'an', 'ex', 'parrot'] for word in words: print(word) numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] for number in numbers: print(number)鑒于迭代(也就是遍歷)特定范圍內的數是一種常見的任務
函數range可實現迭代,左閉右開
如果只提供了一個位置,將把這個位置視為結束位置,并假定起始位置為0
3,迭代字典
通過key來遍歷字典d
只對值感興趣,可使用d.values
d.items以元組的方式返回鍵?值對
for循環的優點之一是,可在其中使用序列解包
4,一些迭代工具
并行迭代
names = ['anne', 'beth', 'george', 'damon'] ages = [12, 45, 32, 102] for i in range(len(names)): print(names[i], 'is', ages[i], 'years old')''' anne is 12 years old beth is 45 years old george is 32 years old damon is 102 years old '''1,并行迭代
內置函數zip,它將兩個序列“縫合”起來,并返回一個由元組組成的序列
可使用list將其轉換為列表
當序列的長度不同時,函數zip將在最短的序列用完后停止“縫合”
list(zip(range(5), range(1000)))#結果為:[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]2,迭代時獲取索引
替換一個字符串列表中所有包含子串’xxx’的字符串
使用內置函數enumerate
3,反向迭代和排序后再迭代
函數:reversed和sorted,類似于列表方法reverse和sort
不修改對象,而是返回反轉和排序后的版本
sorted返回一個列表,而reversed像zip那樣返回一個更神秘的可迭代對象
要按字母表排序,可先轉換為小寫
sorted("aBc", key=str.lower)#結果為:['a', 'B', 'c']5,跳出循環
1,break
找出小于100的最大平方值
from math import sqrt for n in range(99, 0, -1): root = sqrt(n) if root == int(root): print(n) break #結果為:812,continue
結束當前迭代,并跳到下一次迭代開頭,即跳過循環體中余下的語句,但不結束循環
偽代碼 for x in seq: if condition1: continueif condition2: continuedo_something() do_something_else() do_another_thing() etc()3,while True/break成例
在用戶根據提示輸入單詞時執行某種操作,并在用戶沒有提供單詞時結束循環
while True: word = input('Please enter a word: ') if not word: break print('The word was ', word)6,循環中的 else 子句
from math import sqrt for n in range(99, 81, -1): root = sqrt(n) if root == int(root): print(n) break else: print("Didn't find it!")簡單推導
列表推導是一種從其他列表創建列表的方式,工作原理類似于for循環
[x * x for x in range(10)]#結果為:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81][x*x for x in range(10) if x % 3 == 0]#結果為:[0, 9, 36, 81] [(x, y) for x in range(3) for y in range(3)]#結果為:[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)] #與下列for循環效果等價 result = [] for x in range(3):for y in range(3):result.append((x, y)) #結果為:[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]b在boys列表中,g在girls列表中,若倆名字首字母相等則配對
girls = ['alice', 'bernice', 'clarice'] boys = ['chris', 'arnold', 'bob'] [b+'+'+g for b in boys for g in girls if b[0] == g[0]]#結果為:['chris+clarice', 'arnold+alice', 'bob+bernice']使用圓括號代替方括號并不能實現元組推導,而是將創建生成器
可使用花括號來執行字典推導
在列表推導中,for前面只有一個表達式
在字典推導中,for前面有兩個用冒號分隔的表達式,分別為鍵及其對應的值
三人行
pass、del和exec
1,pass:什么都不做
name = input('your name input,please:') if name == 'beyond': print('Welcome!') elif name == 'huangjiaju': pass elif name == 'yanyu': print('Game Over') else:print("Goodbuy")2,使用del刪除
robin和scoundrel指向同一個字典,因此將None賦給scoundrel后,依然可以通過robin
來訪問這個字典
但將robin也設置為None之后,Python解釋器直接將其刪除,這被稱為垃圾收集
x和y指向同一個列表,但刪除x對y沒有任何影響
只刪除名稱x,而沒有刪除列表本身(值)
在Python中,根本就沒有辦法刪除值
對于你不再使用的值,Python解釋器會立即將其刪除
3,使用exec和eval執行字符串及計算其結果
1,exec
函數exec將字符串作為代碼執行,執行一系列python語句,exec本身是條語句,什么都不返回
exec("print('Hello, world!')")#結果為:Hello, world!函數exec主要用于動態地創建代碼字符串
調用函數exec時只給它提供一個參數絕非好事。
在大多數情況下,還應向它傳遞一個命名空間——用于放置變量的地方(命名空間視為放置變量的地方,類似于一個看不見的字典)
否則代碼將污染你的命名空間,即修改你的變量
將scope打印出來,發現其中包含所有內置函數和值的字典__builtins__。
2,eval
eval計算用字符串表示的Python表達式的值,并返回結果
也可向eval提供一個命名空間
類似Python計算器
向exec或eval提供命名空間時,可在使用這個命名空間前在其中添加一些值
scope = {} scope['x'] = 2 scope['y'] = 3 eval('x * y', scope)#結果為:6同一個命名空間可用于多次調用exec或eval
scope = {} exec('x = 2', scope) eval('x * x', scope)#結果為:4本章節介紹的新函數
| chr(n) | 返回一個字符串,其中只包含一個字符,這個字符對應于傳入的順序值n(0 ≤ n < 256) |
| eval(source[,globals[,locals]]) | 計算并返回字符串表示的表達式的結果 |
| exec(source[, globals[, locals]]) | 將字符串作為語句執行 |
| enumerate(seq) | 生成可迭代的索引?值對 |
| ord? | 接受一個只包含一個字符的字符串,并返回這個字符的順序值(一個整數) |
| range([start,] stop[, step]) | 創建一個由整數組成的列表 |
| reversed(seq) | 按相反的順序返回seq中的值,以便用于迭代 |
| sorted(seq[,cmp][,key][,reverse]) | 返回一個列表,其中包含seq中的所有值且這些值是經過排序的 |
| xrange([start,] stop[, step]) | 創建一個用于迭代的xrange對象 |
| zip(seq1, seq2,…) | 創建一個適合用于并行迭代的新序列 |
總結
以上是生活随笔為你收集整理的第五章 条件、循环及其他语句的全部內容,希望文章能夠幫你解決所遇到的問題。