列印九九乘法表 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=' ') 列印 ...
列印九九乘法表
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 迴圈和列表追加合併為一行代碼,使得代碼更加簡潔和可讀性更高。此外,它也更加函數化,將創建每個開發者簡介的過程分離到單獨的函數中,提高了代碼的可維護性和可擴展性。