Python 核心編程(第二版)——條件和循環

Python 中的 if 子句由三部分組成: 關鍵字本身,用于判斷結果真假的條件表達式, 以及當表達式為真或者非零時執行的代碼塊。if 語句的語法如下:

if expression:
? ? expr_true_suite

單個 if 語句可以通過使用布爾操作符 and , or 和 not實現多重判斷條件或是否定判斷條件。

如果一個復合語句(例如 if 子句, while 或 for 循環)的代碼塊僅僅包含一行代碼, 那么它可以和前面的語句寫在同一行上:if make_hard_copy: send_data_to_printer()。

2.else語句

如果 if 語句的條件表達式的結果布爾值為假, 那么程序將執行 else 語句后的代碼:

if expression:
? ? expr_true_suite
else:
? ? expr_false_suite

Python 的縮進使用強制使代碼正確對齊, 讓程序員來決定 else 屬于哪一個 if . 限制您的選擇從而減少了不確定性。

3.elif(即else-if)語句

elif 是 Python 的 else-if 語句, 它檢查多個表達式是否為真, 并在為真時執行特定代碼塊中的代碼。if 語句后最多只能有一個 else語句, 但可以有任意數量的 elif 語句。

if expression1:
? ? expr1_true_suite
elif expression2:
? ? expr2_true_suite
elif expressionN:
? ? exprN_true_suite
else:
? ? none_of_the_above_suite

4.條件表達式(即“三元操作符”)

語法為:X if C else Y ,C為條件表達式,X 是 C 為 True 時的結果, Y 是 C 為 False 時的結果。

5.while語句

while 循環的語法如下:
while expression:
? ? suite_to_repeat

while 循環的 suite_to_repeat 子句會一直循環執行,直到 expression 值為布爾假。

while True:#無限循環

? ??suite_to_repeat

6.for語句

for 循環會訪問一個可迭代對象(例如序列或是迭代器)中的所有元素, 并在所有條目都處理過后結束循環。它的語法如下:

for iter_var in iterable:
? ? suite_to_repeat

每次循環,iter_var 迭代變量被設置為可迭代對象(序列, 迭代器, 或者是其他支持迭代的對象)的當前元素, 提供給 suite_to_repeat 語句塊使用。

迭代序列有三種基本方法:

1)通過序列項迭代;

1 >>> nameList = ['Walter', "Nicole", 'Steven', 'Henry']
2 >>> for eachName in nameList:
3 ... print eachName, "Lim"
4 ...
5 Walter Lim
6 Nicole Lim
7 Steven Lim
8 Henry Lim
View Code

2)通過序列索引迭代;

 1 >>> nameList = ['Cathy', "Terry", 'Joe', 'Heather',
 2 'Lucy']
 3 >>> for nameIndex in range(len(nameList)):
 4 ... print "Liu,", nameList[nameIndex]
 5 ...
 6 Liu, Cathy
 7 Liu, Terry
 8 Liu, Joe
 9 Liu, Heather
10 Liu, Lucy
View Code

使用 range() 我們可以得到用來迭代 nameList 的索引數列表;使用切片/下標操作符( [ ] ),就可以訪問對應的序列對象。

3)使用項和索引迭代;

 1 >>> nameList = ['Donn', 'Shirley', 'Ben', 'Janice',
 2 ... 'David', 'Yen', 'Wendy']
 3 >>> for i, eachLee in enumerate(nameList):
 4 ... print "%d %s Lee" % (i+1, eachLee)
 5 ...
 6 1 Donn Lee
 7 2 Shirley Lee
 8 3 Ben Lee
 9 4 Janice Lee
10 5 David Lee
11 6 Yen Lee
12 7 Wendy Lee
View Code

?Python 提供了兩種不同的方法來調用 range() . 完整語法要求提供兩個或三個整數參數:

range(start, end, step =1)

range() 會返回一個包含所有 k 的列表, 這里 start <= k < end , 從 start 到 end , k 每次遞增 step . step 不可以為零,否則將發生錯誤。如果只給定兩個參數,而省略 step, step 就使用默認值 1 。

range()簡略語法:range(end) 和?range(start, end)。

核心筆記: 為什么 range() 不是只有一種語法?

range(start=0, end, step =1) # 錯誤

這個語法不可以使用兩個參數調用. 因為 step 要求給定 start . 換句話說, 你不能只傳遞end 和 step 參數. 因為它們會被解釋器誤認為是 start 和 end 。

與序列相關的內建函數:sorted(), reversed(), enumerate(), zip()。sorted() 和 zip() )返回一個序列(列表), 而另外兩個函數( reversed() 和 enumerate() )返回迭代器(類似序列)。

 1 >>>albums = ('Poe', 'Gaudi', 'Freud', 'Poe2')
 2 >>> years = (1976, 1987, 1990, 2003)
 3 >>> for album in sorted(albums):
 4 ... print album,
 5 ...
 6 Freud Gaudi Poe Poe2
 7 >>>
 8 >>> for album in reversed(albums):
 9 ... print album,
10 ...
11 Poe2 Freud Gaudi Poe
12 >>>
13 >>> for i, album in enumerate(albums):
14 ... print i, album
15 ...
16 0 Poe
17 1 Gaudi
18 2 Freud
19 3 Poe2
20 >>>
21 >>> for album, yr in zip(albums, years):
22 ... print yr, album
23 ...
24 1976 Poe
25 1987 Gaudi
26 1990 Freud
27 2003 Poe2
View Code

7.break語句

Python 中的 break 語句可以結束當前循環然后跳轉到下條語句,break 語句可以用在 while 和 for 循環中。

8.continue 語句

核心筆記: continue 語句

當遇到continue 語句時, 程序會終止當前循環,并忽略剩余的語句, 然后回到循環的頂端. 在開始下一次迭代前,如果是條件循環, 我們將驗證條件表達式.如果是迭代循環,我們將驗證是否還有元素可以迭代. 只有在驗證成功的情況下, 才會開始下一次迭代。

continue可以被用在 while 和 for 循環里。

 1 valid = False
 2 count = 3
 3 while count > 0:
 4     input = input("enter password")
 5     # check for valid passwd
 6     for eachPasswd in passwdList:
 7         if input == eachPasswd:
 8             valid = True
 9             break
10         if not valid: # (or valid == 0)
11             print "invalid input"
12             count -= 1
13             continue
14         else:
15              break
View Code

9.pass 語句

Python 提供了 pass 語句, 它不做任何事情 - 即 NOP , ( No OPeration , 無操作) 我們從匯編語言中借用這個概念。pass 同樣也可作為開發中的小技巧, 標記你后來要完成的代碼。例如:

def foo_func():pass
或是
if user_choice == 'do_calc':pass 
else:pass

10. 再談 else 語句

在循環中使用時, else子句只在循環完成后執行, 也就是說 break 語句也會跳過 else 塊。

 1 #!/usr/bin/env python
 2 
 3 def showMaxFactor(num):
 4     count = num / 2
 5     while count > 1:
 6         if num % count == 0:
 7             print('largest factor of %d is %d' % (num, count))
 8             break
 9             count -= 1
10         else:
11              print num, "is prime"
12 
13 for eachNum in range(10, 21):
14     showMaxFactor(eachNum)
View Code

11.迭代器和 iter() 函數

迭代器為類序列對象提供了一個類序列的接口。它們是一組數據結構,你可以利用它們的索引從0 開始一直"迭代" 到序列的最后一個條目. 用"計數"的方法迭代序列是很簡單的. Python 的迭代無縫地支持序列對象, 而且它還允許程序員迭代非序列類型, 包括用戶定義的對象。

為什么要迭代器?

? 提供了可擴展的迭代器接口.
? 對列表迭代帶來了性能上的增強.
? 在字典迭代中性能提升.
? 創建真正的迭代接口, 而不是原來的隨機對象訪問.
? 與所有已經存在的用戶定義的類以及擴展的模擬序列和映射的對象向后兼容
? 迭代非序列集合(例如映射和文件)時, 可以創建更簡潔可讀的代碼.

如何迭代?

迭代器就是有一個 next() 方法的對象, 而不是通過索引來計數。 當你或是一個循環機制(例如 for 語句)需要下一個項時, 調用迭代器的 next() 方法就可以獲得它。條目全部取出后,會引發一個 StopIteration 異常, 這并不表示錯誤發生,只是告訴外部調用者, 迭代完成。

reversed() 內建函數將返回一個反序訪問的迭代器;enumerate() 內建函數同樣也返回迭代器;另外兩個新的內建函數, any() 和 all(),如果迭代器中某個/所有條目的值都為布爾真時,則它們返回值為真。

使用迭代器:

1)序列(for 循環會自動調用迭代器的 next() 方法(以及監視StopIteration 異常))

 1 >>> myTuple = (123, 'xyz', 45.67)
 2 >>> i = iter(myTuple)
 3 >>> i.next()
 4 123
 5 >>> i.next()
 6 'xyz'
 7 >>> i.next()
 8 45.67
 9 
10 fetch = iter(seq)
11 while True:
12     try:
13         i = fetch.next()
14     except StopIteration:
15         break
16 do_something_to(i)
View Code

2)字典

字典和文件是另外兩個可迭代的 Python 數據類型. 字典的迭代器會遍歷它的鍵(keys)。語句 for eachKey in myDict.keys() 可以縮寫為 for eachKey in myDict。

3)文件

文件對象生成的迭代器會自動調用 readline() 方法。這樣, 循環就可以訪問文本文件的所有行,也可以使用更簡單的 for eachLine in myFile。

記住:在迭代可變對象的時候修改它們并不是個好主意。

一個序列的迭代器只是記錄你當前到達第多少個元素, 所以如果你在迭代時改變了元素, 更新會立即反映到你所迭代的條目上.在迭代字典的 key 時, 你絕對不能改變這個字典. 使用字典的 keys() 方法是可以的, 因為keys() 返回一個獨立于字典的列表. 而迭代器是與實際對象綁定在一起的, 它將不會繼續執行下去。

1 >>> myDict = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
2 >>> for eachKey in myDict:
3 ... print eachKey, myDict[eachKey]
4 ... del myDict[eachKey]
5 ... a 1
6 Traceback (most recent call last):
7 File "", line 1, in ?
8 RuntimeError: dictionary changed size during iteration
View Code

如何創建迭代器?

對一個對象調用 iter() 就可以得到它的迭代器. 它的語法如下:

iter(obj)
iter(func, sentinel )

如果你傳遞一個參數給 iter() , 它會檢查你傳遞的是不是一個序列, 如果是, 那么很簡單:根據索引從 0 一直迭代到序列結束. 另一個創建迭代器的方法是使用類。如果是傳遞兩個參數給 iter() , 它會重復地調用 func , 直到迭代器的下個值等于sentinel 。

12.列表解析

列表解析的語法:[expr for iter_var in iterable]

這個語句的核心是 for 循環, 它迭代 iterable 對象的所有條目. 前邊的 expr 應用于序列的每個成員, 最后的結果值是該表達式產生的列表. 迭代變量并不需要是表達式的一部分。

列表解析還提供了一個擴展版本的語法:[expr for iter_var in iterable if cond_expr],這個語法在迭代時會過濾/捕獲滿足條件表達式 cond_expr 的序列成員。

矩陣樣例:

>>> [(x+1,y+1) for x in range(3) for y in range(5)]
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2,
3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]

磁盤文件樣例:

可以通過 for line in data 迭代文件內容,不過, 除了這個, 我們還可以把每行分割( split )為單詞, 然后我們可以像這樣計算單詞個數:

>>> f = open('hhga.txt', 'r')
>>> len([word for line in f for word in line.split()])
91

快速地計算文件大小
import os
>>> os.stat('hhga.txt').st_size
499L

假定文件中至少有一個空白字符, 我們知道文件中有少于 499 個非空字符. 我們可以把每個單詞的長度加起來, 得到和:

>>> f.seek(0)
>>> sum([len(word) for line in f for word in line.split()])
408

13.生成器表達式

生成器表達式是列表解析的一個擴展。生成器是特定的函數, 允許你返回一個值, 然后"暫停"代碼的執行, 稍后恢復。列表解析的一個不足就是必要生成所有的數據, 用以創建整個列表. 這可能對有大量數據的迭代器有負面效應. 生成器表達式通過結合列表解析和生成器解決了這個問題。

列表解析:
[expr for iter_var in iterable if cond_expr]
生成器表達式:
(expr for iter_var in iterable if cond_expr)

生成器表達式并不真正創建數字列表, 而是返回一個生成器,這個生成器在每次計算出一個條目后,把這個條目“產生”(yield)出來. 生成器表達式使用了"延遲計算"(lazy evaluation), 所以它在使用內存上更有效.

磁盤文件樣例:

>>> sum(len(word) for line in data for word in line.split()) ? ? ##sum() 函數(它的參數不僅可以是列表,還可以是可迭代對象,比如生成器表達式)
408

交叉配對例子:

 1 rows = [1, 2, 3, 17]
 2 
 3 def cols(): # example of simple generator
 4     yield 56
 5     yield 2
 6     yield 1
 7 
 8 x_product_pairs = ((i, j) for i in rows for j in cols())
 9 
10 >>> for pair in x_product_pairs:
11 ... print pair
12 ...
13 (1, 56)
14 (1, 2)
15 (1, 1)
16 (2, 56)
17 (2, 2)
18 (2, 1)
19 (3, 56)
20 (3, 2)
21 (3, 1)
22 (17, 56)
23 (17, 2)
24 (17, 1)
View Code

重構樣例:

讀取文件的行的首選方法應該是這樣:(readlines() 會讀取文件的所有行)

1 f = open('/etc/motd', 'r')
2 longest = 0
3 allLines = f.readlines()
4 f.close()
5 for line in allLines:
6     linelen = len(line.strip())
7     if linelen > longest:
8         longest = linelen
9 return longest
View Code

轉載于:https://www.cnblogs.com/christal-11/p/7682414.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540466.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540466.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540466.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉載] 【python魔術方法】迭代器(__iter__和__next__)

參考鏈接&#xff1a; Python __iter __()和__next __()| 將對象轉換為迭代器 文章目錄 __iter__ 和 __next__真正的迭代器總結 python里面有很多的以__開始和結尾的函數&#xff0c;利用它們可以完成很多復雜的邏輯代碼&#xff0c;而且提高了代碼的簡潔性&#xff0c;本文主…

Silverlight 異步單元測試

Silverlight 中的很多操作都是異步的&#xff0c;很多情況下要求單元測試也是異步的&#xff0c;但是介紹異步單元測試的文檔很少。通過對 Silverlight Toolkit 中的 Microsoft.Silverlight.Testing 和 Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight 這兩個文件…

網絡拓撲 令牌環網 以太網_以太網連接中網絡拓撲的類型及其框架 以太網技術...

網絡拓撲 令牌環網 以太網A topology explains how physically the network is designed or what is the structure of the network. These designs are both physical and logical. There are many network topologies 4 like Bus, Star, Ring, and Mesh. But only two types …

Wafer晶圓封裝工藝介紹

芯片封裝的目的&#xff08;The purpose of chip packaging&#xff09;: 芯片上的IC管芯被切割以進行管芯間連接&#xff0c;通過引線鍵合連接外部引腳&#xff0c;然后進行成型&#xff0c;以保護電子封裝器件免受環境污染&#xff08;水分、溫度、污染物等&#xff09;&…

[轉載] Python中的解析式和生成器表達式

參考鏈接&#xff1a; Python | 生成器表達式 解析式和生成器表達式 列表解析List Comprehension 語法 [返回值 for 元素 in 可迭代對象 if 條件]使用中括號[],內部是for循環&#xff0c;if條件語句可選&#xff0c;會返回一個新的列表 列表解析試優點 編譯器會優化&…

java 數字字母進位_使用帶有進位的8085微處理器將兩個8位數字相乘

java 數字字母進位Problem statement: 問題陳述&#xff1a; Multiplication of two 8 bits numbers using 8085 microprocessor with carry. 使用帶有進位的8085微處理器將兩個8位數字相乘。 Algorithm: 算法&#xff1a; Load HL pair with initial data using LHLD comma…

[轉載] Python3.0中普通方法、類方法和靜態方法的比較

參考鏈接&#xff1a; Python中的類方法與靜態方法 一、語法區別 剛接觸Python中的面向對象&#xff0c;對于類方法和靜態方法難以區分&#xff0c;通過查找知乎、CSDN論壇&#xff0c;廢了好大的勁思路才逐漸明朗&#xff0c;所以就總結順便分享一下。 首先開始編輯代碼 # 普…

iOS:個人淺談工廠模式

一、什么是工廠方法&#xff1f; 正式的解釋是&#xff1a;在基類中定義創建對象的一個接口&#xff0c;讓子類決定實例化哪個類。工廠方法讓一個類的實例化延遲到子類中進行。工廠方法要解決的問題是對象的創建時機&#xff0c;它提供了一種擴展的策略&#xff0c;很好地符合了…

scanf 輸入十六進制_使用C語言中的scanf()在字符變量中輸入十進制,八進制和十六進制值...

scanf 輸入十六進制Here, we will declare an unsigned char variable and input different formats value like decimal format, octal format and hexadecimal format. 在這里&#xff0c;我們將聲明一個無符號的char變量&#xff0c;并輸入不同格式的值&#xff0c;例如十進…

[轉載] Python中pass的作用

參考鏈接&#xff1a; 如何在Python中編寫空函數&#xff1f;請使用 pass語句 空語句 do nothing保證格式完整保證語義完整 以if語句為例&#xff0c;在c或c/java中&#xff1a; if(true) ; //do nothing else { //do something } 對應于python就要這樣寫&#xff…

wrf 嵌套網格作用_在網格系統中使用響應列,嵌套列和偏移列 引導程序

wrf 嵌套網格作用介紹 (Introduction) In the previous article, we have learnt what is grid and grid system and how it works? Now, we will learn about how Responsive column, Nesting Columns and Offset Columns works and how to use them? If you have any doubt…

[看書筆記]《深入java虛擬機》——java體系結構(二)

java虛擬機的三種含義&#xff1a; - 抽象的規范 - 一個具體的實現 - 一個運行中的虛擬機實例 ---------------------java虛擬機的生命周期&#xff1a; java虛擬機實例的天職就是負責運行一個java程序。 啟動一個java程序&#xff0c;一個虛擬機實例誕生了&#xff1b;程序關閉…

[轉載] 【零基礎學爬蟲】python中的yield詳解

參考鏈接&#xff1a; 什么時候在Python中使用yield而不是return python中的yield功能比較強大&#xff0c;什么意思呢&#xff1f;如果一個函數f內使用了yield關鍵詞&#xff0c;那么該函數就可以這樣使用&#xff1a; for item in f(***): **** 也就是包含yield關鍵詞的函…

全新的membership框架Asp.net Identity(1)——.Net membership的歷史

在Asp.net上&#xff0c;微軟的membershop框架經歷了Asp.net membership到Asp.net simple membership&#xff0c;再到現在的Asp.net Identity. 每一次改變&#xff0c;都使得驗證框架更加的適應變化和可定制。這篇文章是Asp.net Identity系列的開篇&#xff0c;主要就membersh…

c語言100位整數變量聲明_C ++程序動態聲明一個整數變量并打印其內存地址

c語言100位整數變量聲明Here, we will learn how we can declare an integer variable dynamically and how to print address of declared memory block? 在這里&#xff0c;我們將學習如何動態聲明整數變量&#xff0c;以及如何打印聲明的內存塊的地址&#xff1f; In C pr…

[轉載] python 函數返回多個值

參考鏈接&#xff1a; 在Python中返回多個值 &#xff08;廖雪峰Python教程學習筆記&#xff09; 函數體內部的語句在執行時&#xff0c;一旦執行到return&#xff0c;函數就執行完畢&#xff0c;并將結果返回。 如果沒有return語句&#xff0c;函數執行完畢后也會返回結果…

二.編寫第一個c#程序(注釋,命名空間,類,Main方法,標識符,關鍵字,輸入,輸出語句,)...

復習編寫一個控制臺應用程序&#xff0c;目標是在控制臺輸出“Hello World” 1.第一步&#xff0c;打開Visual Studio 2012以上版本(我用的是VS 2015)&#xff0c;打開完成后出現以下界面 2.第二步&#xff0c;這時候就要新建一個解決方案了&#xff0c;創建解決方案可以直接點…

[轉載] Python中定義函數,循環語句,條件語句

參考鏈接&#xff1a; Python中的局部函數 由于日常程序流中主要是三種結構&#xff1a;順序&#xff0c;循環&#xff0c;條件&#xff0c;且往往需要自定義函數再調用&#xff0c; 因此今天想學習一下Python中關于定義函數、循環語句和條件語句的寫法。 1.定義函數 區…

node oauth2驗證_如何設置和使用護照OAuth Facebook身份驗證(第1部分)| Node.js

node oauth2驗證In my last articles, we looked at the implementation of the passport-local authentication strategy. We also looked at the various requirements to get started with the login form. 在上一篇文章中&#xff0c;我們介紹了護照本地身份驗證策略的實現…

vue2.0 引用qrcode.js實現獲取改變二維碼的樣式

vue代碼 <template><div class"qart"><div id"qrcode" ref"qrcode"></div><input type"text" id"getval" value"" placeholder"修改這個值改變二維碼"></div> <…