列印九九乘法表
for i in range(1, 10):
for j in range(1, i+1):
print(i, "x", j, "=", i * j, end=' ')
print("\n")
第三行的 print(i, "x", j, "=", i * j, end=' ') 列印出 i 和 j 的乘積,并在末尾添加一個空格,以便下一個數字可以與其對齊,第四行的 print("\n") 列印一個換行符,以便下一行可以開始列印,
range() 函式的結束值是不包括在范圍內的,range(1, 10) 將生成從1到9的數字,但不包括10,
- 生成從0到5的整數序列:
range(6) - 生成從2到10的偶數序列:
range(2, 11, 2) - 生成從10到1的倒序整數序列:
range(10, 0, -1)
多種 Hello World
if __name__ == '__main__':
str_list = ["Hello,","World!"]
str1 = "Hello,"
str2 = "World!"
print("Hello,"+"World!")
print(''.join(str_list))
print(str1+str2)
print('str1'+'str2')
if __name__ == '__main__' 是 Python 中一個常用的條件陳述句,其作用是檢查當前模塊是否被直接運行(作為主程式),還是被匯入到其他模塊中使用,
當一個 Python 檔案被執行時,Python 解釋器會把該檔案作為主程式執行,此時 __name__ 變數的值為 '__main__',
如果一個Python檔案被其他檔案匯入并使用,__name__變數的值則為該檔案的模塊名(不包括.py擴展名),
因此,通過在 Python 代碼中使用 if __name__ == '__main__': 條件陳述句,我們可以在代碼中添加一些只有在該模塊作為主程式運行時才會執行的代碼塊,而在該模塊被匯入到其他模塊中時,這些代碼塊不會被執行,這種做法可以提高代碼的復用性和可維護性,也可以避免在模塊被匯入時產生意外的副作用,
編程語言簡史
歷史上有很多編程語言,他們在編程語言發展的程序中都起到過重要的作用,
下面的 Python 陣列包含了歷史上的大部分編程語言,
languages = ["Regional Assembly Language","Autocode","FORTRAN","IPL (LISP的先驅)","FLOW-MATIC (COBOL的先驅)","COMTRAN (COBOL的先驅)","LISP","ALGOL 58","FACT (COBOL的先驅)","COBOL","APL","Simula","SNOBOL","CPL (C的先驅)","BASIC","PL/I","BCPL (C的先驅)","Logo","Pascal","Forth","C語言","Smalltalk","Prolog","ML","Scheme","SQL","Ada","C++","Common Lisp","MATLAB","Eiffel","Objective-C","Erlang","Perl","Tcl","FL (Backus)","Haskell","Python","Visual Basic","HTML","Ruby","Lua","CLOS (part of ANSI Common Lisp)","Java","Delphi (Object Pascal)","JavaScript","PHP","REBOL","D","C#","Visual Basic .NET","F#","Scala","Factor","Windows PowerShell","Rust","Clojure","Go"]
下面的 Python 陣列包含了這些編程對應的創建時間,
years = [1951, 1952, 1954, 1954, 1955, 1957, 1958, 1958, 1959, 1959, 1962, 1962, 1962, 1963, 1964, 1964, 1967 ,1968 ,1970 ,1970 ,1972 ,1972 ,1972 ,1973 ,1975 ,1978 ,1980 ,1983 ,1984 ,1984 ,1985 ,1986 ,1986 ,1987 ,1988 ,1989 ,1990 ,1991 ,1991 ,1991 ,1993 ,1993 ,1994 ,1995 ,1995 ,1995 ,1995 ,1997 ,1999 ,2001 ,2001 ,2002 ,2003 ,2003 ,2006 ,2006 ,2007 ,2009]
撰寫一個 Python 程式,每行列印每個編程語言的名字和對應的創建時間,例如:
Regional Assembly Language : 1951
Autocode : 1952
FORTRAN : 1954
...
補全代碼分析
if __name__ == '__main__':
languages = ...
years = ...
i = 0
while i < len(years):
language = languages[i]
year = years[i]
print(language, ':', year)
i += 1
if __name__ == '__main__':
languages = ...
years = ...
[print(languages[i], ':', years[i]) for i in range(0, len(languages))]
if __name__ == '__main__':
languages = ...
years = ...
for i in range(0, len(languages)):
language = languages[i]
year = years[i]
print(language, ':', year)
第三段代碼更好一些,因為它使用了更為 Pythonic 的方式來遍歷兩個串列,具體來說,它使用了 Python 中常用的 for-in 回圈陳述句,而不是使用 while 回圈或串列推導式來實作,
相比于第一段代碼,第三段代碼使用了更簡潔的語法,同時也更易讀,使用 for-in 回圈可以直接遍歷串列中的元素,而不需要額外的計數器變數,此外,使用 range() 函式生成一個整數序列的方式更為常見,也更易于理解,
相比于第二段代碼,第三段代碼也更為傳統,更易于理解,使用串列推導式可以讓代碼更為緊湊,但在某些情況下可能會犧牲可讀性,尤其是當串列推導式中嵌套了復雜的運算式時,而使用 for-in 回圈則可以讓代碼更加自然地表達遍歷兩個串列的邏輯,也更容易理解和維護,
編程語言發明家
每個編程語言都有其內在的編程范式,體現著編程語言設計者的哲學,編程語言發展史上有許多杰出的人物,下面是一些例子:
programmers = [
"約翰·巴科斯(JohnWarnerBackus), 創建了Fortran語言",
"阿蘭·庫珀(Alan Cooper), 開發了Visual Basic語言",
"詹姆斯·高斯林(James Gosling), 開發了Java語言",
"安德斯·海爾斯伯格(Anders Hejlsberg), 開發了Turbo Pascal、Delphi、C#以及TypeScript",
"丹尼斯·里奇(Dennis MacAlistair Ritchie), 發明了C語言",
"比雅尼·斯特勞斯特魯普(Bjarne Stroustrup), 他以創造C++編程語言而聞名,被稱為“C++之父”",
"吉多·范羅蘇姆(Guido van Rossum), 創造了 Python"
]
為了進一步對上述文本資料決議,獲得如下格式的結構化資訊:
[
{"name_cn": "約翰·巴科斯", "name_en": "JohnWarnerBackus", "achievement": "創建了Fortran語言"},
{"name_cn": "阿蘭·庫珀", "name_en": "Alan Cooper", "achievement": "開發了Visual Basic語言"},
...
]
我們先分析一個例子,決議這個文本資料:"吉多·范羅蘇姆(Guido van Rossum), 創造了 Python",
- 首先,定義一個函式
parse_parts,通過第一個逗號,拆分出發明家的名字資訊和成就資訊, - 其次,定義一個函式
parse_name,通過對name的進一步拆分,獲得發明家的中英文名字資訊, - 最后,定義一個函式
parse_creators,完成決議,
完整的代碼模版如下:
def parse_parts(creator):
index = creator.find(',')
name, achievement = creator[0:index], creator[index+1:]
return name.strip(), achievement.strip()
def parse_name(name):
index = name.find('(')
name_cn, name_en = name[0:index], name[index:]
name_en = name_en[1:len(name_en)-1]
return name_cn, name_en
def parse_creators(creators):
# TODO(YOU): 請在此處正確實作
if __name__ == '__main__':
creators = ...
profiles = parse_creators(creators)
print(profiles)
前面結構分析
def parse_parts(creator):
index = creator.find(',')
name, achievement = creator[0:index], creator[index+1:]
return name.strip(), achievement.strip()
這段 Python 代碼定義了一個名為 parse_parts 的函式,它接收一個字串型別的引數 creator,這個引數是由一個名字和成就組成的字串,中間由逗號分隔,函式回傳一個包含兩個元素的元組,第一個元素是名字,第二個元素是成就,都去掉了開頭和結尾的空格,
具體的實作程序如下:
- 使用字串方法
find()查找逗號在字串creator中的位置,并回傳它的索引, - 使用字串切片的方式,將名字和成就從
creator中分離出來,這里使用逗號的索引將字串creator分成了兩個部分,前面的部分是名字,后面的部分是成就, - 使用字串方法
strip()將名字和成就的開頭和結尾的空格去掉, - 將名字和成就組成一個元組并回傳,
例如,如果creator是"張三, 中國科學院院士",那么函式回傳(“張三”, “中國科學院院士”),
strip() 函式的作用是移除字串頭尾指定的字符(默認為空格或換行符)或字符序列,例如,如果 s 是" hello world “,那么s.strip()回傳"hello world”,去除了首尾的空格,如果 s 是"000123000",那么s.strip(‘0’)回傳"123",去除了首尾的0,
def parse_name(name):
index = name.find('(')
name_cn, name_en = name[0:index], name[index:]
name_en = name_en[1:len(name_en)-1]
return name_cn, name_en
這段 Python 代碼定義了一個名為 parse_name 的函式,用于決議程式員的名字,下面是代碼的詳細解釋:
def parse_name(name)::定義函式parse_name,它接收一個名字字串name作為引數,index = name.find('('):查找名字字串中左括號(的位置,回傳其索引值,賦值給變數index,name_cn, name_en = name[0:index], name[index:]:使用括號中的索引值index將名字字串分割為中文名和英文名兩部分,中文名存盤在變數name_cn中,英文名存盤在變數name_en中,name_en = name_en[1:len(name_en)-1]:將英文名字串的第一個字符和最后一個字符(即左右括號)去除,得到真正的英文名,return name_cn, name_en:回傳名字的中文名和英文名,用元組的形式回傳,
例如,如果 name 是"張三(Sam)",那么函式回傳(“張三”, “Sam”),
補全代碼分析
def parse_creators(creators):
profiles = []
for creator in creators:
name, achievement = parse_parts(creator)
name_cn, name_en = parse_name(name)
profiles.append({ 'name_cn': name_cn, 'name_en': name_en, 'achievement': achievement })
return profiles
這段 Python 代碼實作了一個函式 parse_creators,該函式接收一個字串串列 creators 作為引數,每個字串都代表了一個編程語言創始人的姓名和成就,函式的作用是將這些字串決議成字典型別的資料,并將這些字典組成的串列作為函式的回傳值,
具體而言,函式中使用了一個for回圈,對于每個字串creator,首先呼叫parse_parts函式將其決議成姓名和成就兩個部分,然后呼叫parse_name函式將姓名決議成中文名和英文名兩個部分,最后將中英文姓名和成就組成一個字典,并將該字典添加到profiles串列中,最終,函式回傳這個串列,其中包含了所有編程語言創始人的資訊,
append() 函式是 Python 串列中的一種方法,用于在串列末尾添加元素,在上面的代碼中,profiles 串列通過 append() 方法向其末尾添加字典元素,每個字典元素包含了一個編程語言的創建者的名字、成就和中英文名字,每次回圈迭代時,都會創建一個新的字典元素,并將其添加到 profiles 串列中,最侄訓傳一個包含所有編程語言創建者資訊的串列,
append() 函式的作用是在串列的末尾添加一個新的元素,例如,如果 a 是[1, 2, 3],那么a.append(4)會使 a 變成[1, 2, 3, 4],注意,append()函式沒有回傳值,但是會修改原來的串列,
def parse_profile(creator):
name, achievement = parse_parts(creator)
name_cn, name_en = parse_name(name)
return { 'name_cn': name_cn, 'name_en': name_en, 'achievement': achievement }
def parse_creators(creators):
return [ parse_profile(creator) for creator in creators]
這里的串列決議式 [ parse_profile(creator) for creator in creators] 將 parse_profile(creator) 應用于 creators 串列中的每個元素 creator,并將決議結果組成一個新的串列,這種寫法更加簡潔明了,避免了使用回圈陳述句的繁瑣,
def parse_profile(creator):
name, achievement = parse_parts(creator)
name_cn, name_en = parse_name(name)
return { 'name_cn': name_cn, 'name_en': name_en, 'achievement': achievement }
def parse_creators(creators):
profiles = []
for creator in creators:
profile = parse_profile(creator)
profiles.append(profile)
return profiles
使用了串列推導式,將 for 回圈和串列追加合并為一行代碼,使得代碼更加簡潔和可讀性更高,此外,它也更加函式化,將創建每個開發者簡介的程序分離到單獨的函式中,提高了代碼的可維護性和可擴展性,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/549731.html
標籤:其他
下一篇:JVM:并發的可達性分析
