【Python】Python 练习:「技能树-预备知识」② 程序设计思想-1

目录

一、练习题

二、题目解析

① 计算列表中元素的数量

② 按字母顺序排序列表

③ 搜索一个特定的元素是否在列表中 

④ 对列表进行切片,可以获取指定范围内的元素

⑤ 从列表中移除一个元素

三、答案解析

(1)正确写法 

① 写法 1

② 写法 2

③ 写法 3

(2)错误写法 

① 写法 1



一、练习题

编程语言简史

贡献者:幻灰龙

小知识:

  • 历史上有很多编程语言,他们在编程语言发展的过程中都起到过重要的作用。

题目:

  • 下面的 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
...

请找出以下代码中错误的选项。



二、题目解析

【功能】题目给出了许多编程语言的名称,可以根据需要提取、处理和使用相关信息

【变量】为了方便处理,可以将这些名称存储为一个列表变量 languages

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"]

【运用示例】接下来就可以用各种方法对这些编程语言进行处理:

  • 计算列表中元素的数量
  • 按字母顺序排序列表
  • 搜索一个特定的元素是否在列表中
  • 对列表进行切片,可以获取指定范围内的元素
  • 从列表中移除一个元素

【特别注意】排序结果对字母的大小写是敏感的,因此大写字母的顺序会优先于小写字母

① 计算列表中元素的数量

【代码示例】 

  • 使用 len 函数可以获取列表中元素的个数,结果将被存储在变量 num_languages 中并打印出来
  • 输出变量 languages 中元素的数量,即编程语言的总数:
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"]

num_languages = len(languages)
print("num_languages: ", num_languages)

【执行结果】

  • 可以看到,输出结果为 57,即变量 languages 中有 57 个元素,表示了 57 种编程语言
num_languages:  57

② 按字母顺序排序列表

 【代码示例】

  • 可以使用 sorted 方法,对列表 languages 进行排序,
  • 并将排序后的结果存储在变量 sorted_languages 中,然后将其打印出来
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"]

sorted_languages = sorted(languages)
print("sorted_languages: ", sorted_languages)

【执行结果】

  • 输出结果为排序后的编程语言列表,按字母顺序从 A 到 Z 排序,对于带有小写字母的编程语言,它们会在大写字母开头的编程语言后面列出
  • 由于大小写敏感,因此最后列表中的 “go” 应该放在 “Windows PowerShell” 的后面:
sorted_languages:  ['ALGOL 58', 'APL', 'Ada', 'Autocode', 'BASIC', 'BCPL (C的先驱)', 'C#', 'C++', 'CPL (C的先驱)', 'Clojure', 'COMTRAN (COBOL的先驱)', 'Common Lisp', 'Delphi (Object Pascal)', 'D', 'Eiffel', 'Erlang', 'FACT (COBOL的先驱)', 'FLOW-MATIC (COBOL的先驱)', 'FL (Backus)', 'FORTRAN', 'Factor', 'Forth', 'F#', 'Go', 'Haskell', 'HTML', 'IPL (LISP的先驱)', 'Java', 'JavaScript', 'LISP', 'LOGO', 'Lua', 'MATLAB', 'ML', 'Objective-C', 'PHP', 'PL/I', 'Pascal', 'Prolog', 'Python', 'REBOL', 'Regional Assembly Language', 'Ruby', 'Rust', 'SQL', 'Scala', 'Scheme', 'Simula', 'Smalltalk', 'SNOBOL', 'Tcl', 'Visual Basic', 'Visual Basic .NET', 'Windows PowerShell', 'go']

③ 搜索一个特定的元素是否在列表中 

【代码示例】

  • 注意:排序结果对字母的大小写是敏感的,因此大写字母的顺序会优先于小写字母
  • 用于在列表 languages 中搜索特定的编程语言 search_language,并确定是否存在于列表中
  • 如果该编程语言存在于列表中,那么将打印一条消息,告知其已经存在于列表中
  • 否则,将会打印另一条消息,说明该编程语言不存在于列表中
  • 可以使用 in 关键字:
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"]

search_language = "Python"
if search_language in languages:
    print(search_language, "is in the list!")
else:
    print(search_language, "is not in the list!")

【执行结果】

  • 由于 “Python” 存在于列表中,因此输出了 “Python is in the list!” 这条消息:
Python is in the list!

④ 对列表进行切片,可以获取指定范围内的元素

【代码示例】 

  • 以下代码展示了如何利用 Python 的切片操作,获取列表 languages 中第 10 个元素到第 20 个元素(左闭右开区间,即不包括第 20 个元素)
  • 首先,我们定义了一个名为 languages 的列表,其中包含了多个编程语言的字符串
  • 接着,通过对 languages 列表进行切片操作 languages[10:20],我们获取了该列表中第 10 个元素到第 20 个元素的一个新列表
  • 此时,我们将这个新列表赋值给变量 slice_languages
  • 最后,通过调用 print 函数,我们输出该新列表的值
  • 注意,Python 中的切片操作通过指定要截取的元素的开始和结束索引来完成
  • 在本例中,用 10 和 20 分别表示了要截取的区间的开始和结束索引,其中左闭右开区间的特性意味着第 10 个元素对应的索引是 10 ,而第 20 个元素对应的索引则是 20-1=19
  • 也就是说,切片操作 languages[10:20] 实际上会获取到 languages 列表中的第 10 个元素到第 19 个元素:
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"]

slice_languages = languages[10:20]    # 获取第 10-20 个元素,注意左闭右开区间
print("slice_languages: ", slice_languages)

【执行结果】

  • 输出的结果是新列表 slice_languages 的值,其中包含了 languages 列表中第 10 个元素到第 20 个元素的所有元素
  • 该列表中包含了以下10个元素:'APL', 'Simula', 'SNOBOL', 'CPL (C的先驱)', 'BASIC', 'PL/I', 'BCPL (C的先驱)', 'Logo', 'Pascal', 'Forth'
  • 注意:输出结果中,列表各个元素的顺序与在源列表中的顺序是一致的,表明切片操作并未对元素的相对顺序做出调整:
slice_languages: ['APL', 'Simula', 'SNOBOL', 'CPL (C的先驱)', 'BASIC', 'PL/I', 'BCPL (C的先驱)', 'Logo', 'Pascal', 'Forth']

⑤ 从列表中移除一个元素

【代码示例】 

  • 可以使用 Python 的 remove 方法,从列表 languages 中删除指定的元素
  • 首先,我们定义了一个名为 languages 的列表,其中包含了多个编程语言的字符串
  • 接着,我们使用 remove 方法从该列表中删除了一个元素;这里,我们使用字符串 "COMTRAN (COBOL的先驱)" 作为参数,指定要删除的元素
  • 最后,我们通过调用 print 函数,输出删除后的整个列表 languages :
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"]

languages.remove("COMTRAN (COBOL的先驱)")
print(languages)

【执行结果】

  • 运行该段代码后,输出的结果是这个列表 languages 的值(已经删除了指定元素)
  • 会移除 languages 中的 "COMTRAN (COBOL的先驱)" 这个元素,并打印结果
  • 如果在运行 remove 方法代码之前先输出 languages,那么可以看到 "COMTRAN (COBOL的先驱)" 存在于该列表中
  • 从输出结果可以看到,被删除元素的字符串 "COMTRAN (COBOL的先驱)" 已经不在该列表中了
  • 同时,其余元素的顺序也未发生改变:
['Regional Assembly Language', 'Autocode', 'FORTRAN', 
 'IPL (LISP的先驱)', 'FLOW-MATIC (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']


三、答案解析

(1)正确写法 

① 写法 1

if __name__ == '__main__':
    # 定义了两个列表变量,分别存储了多个编程语言及其所属年份的信息
    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"]
    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]
    
    # 定义一个变量 i,用于遍历 years 列表的每个元素
    i = 0
    
    # 使用 while 循环,持续遍历 years 列表中的所有元素(也就是遍历了 languages 列表中的所有元素)
    while i < len(years):
        # 获取当前索引对应的语言名称和年份
        language = languages[i]
        year = years[i]
        
        # 输出当前语言和对应的年份信息
        print(language, ':', year)
        
        # 将索引 i 增加 1,以便下一次循环取下一个索引对应的元素
        i += 1

【代码功能】

  • 展示了如何使用 while 循环和列表的索引来同时遍历两个列表(languagesyears
  • 并在每次循环中输出一个语言及其所属的年份
  • if name == ‘main: 语句块则用来确保当前模块的代码只在直接运行时才被执行,而不会在其它模块导入时被调用

【代码详解】

  1. 首先,我们定义了两个变量 languagesyears ,用于存储多个编程语言及其所属的年份信息
  2. 接着,我们使用一个 ​​​​​​​while ​​​​​​​循环和一个变量 ​​​​​​​i ​​​​​​​,来遍历这两个列表;具体来说,循环会一直执行,直到 ​​​​​​​i ​​​​​​​的值大于或等于 ​​​​​​​years 列表的长度为止
  3. 在每次循环中,我们分别获取 ​​​​​​​languages ​​​​​​​列表和 ​​​​​​​years ​​​​​​​列表中的当前索引所对应的值,即 ​​​​​​​language ​​​​​​​和 ​​​​​​​year;具体来说,我们通过访问 ​​​​​​​languages[i] ​​​​​​​和 ​​​​​​​years[i] 来获取它们的值
  4. 最后,我们输出这个编程语言及其所属年份的信息;注意,在输出时我们使用了一个冒号 ​​​​​​​: 来将这两个信息分隔开

【执行结果】

Regional Assembly Language : 1951
Autocode : 1952
FORTRAN : 1954
IPL (LISP的先驱) : 1954
FLOW-MATIC (COBOL的先驱) : 1955
...

② 写法 2

if __name__ == '__main__':
    # languages 和 years 列表
    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"]
    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]
    for i in range(0, len(languages)):
        language = languages[i]
        year = years[i]
        print(language, ':', year)

【代码功能】

  • 展示了如何使用 for 循环来同时遍历两个列表(languagesyears
  • 并依次打印每个存储在这两个列表中的编程语言名称和它们出现的年份
  • 主要实现了一个循环遍历两个列表并打印结果的功能

【代码详解】

  1. 首先,我们定义了两个变量 ​​​​​​​languages ​​​​​​​和 ​​​​​​​years ,用于存储多个编程语言及其所属的年份信息
  2. 通过 for 循环遍历 languages ​​​​​​​和 ​​​​​​​years 中的所有元素
  3. 其中,遍历到的当前元素是通过 ​​​​​​​languages[i] ​​​​​​​和 ​​​​​​​years[i] ​​​​​​​表达的
  4. 因为 languages ​​​​​​​和 ​​​​​​​years 索引是对应的,所以在遍历时可以通过相同的 i 取得两个数组相同位置的元素
  5. 获取到当前语言和对应的年份后,按照格式化的方式使用 print()函数输出语言名称和对应的年份

【执行结果】

  • 将存储在两个列表变量 languages ​​​​​​​和 ​​​​​​​years 中的信息打印出来,每行表示一种编程语言和它的出现年份:
Regional Assembly Language : 1951
Autocode : 1952
FORTRAN : 1954
IPL (LISP的先驱) : 1954
FLOW-MATIC (COBOL的先驱) : 1955
COMTRAN (COBOL的先驱) : 1957
...

③ 写法 3

if __name__ == '__main__':
    # languages 和 years 列表
    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"]
    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]
    [print(languages[i], ':', years[i]) for i in range(0, len(languages))]

【代码功能】

  • 打印出存储在两个列表变量languages ​​​​​​​和 ​​​​​​​years 中的编程语言名称和它们出现的年份
  • 主要实现了一个循环遍历两个列表并打印结果的功能
  • 使用了 Python 的列表推导式(list comprehension)来实现遍历和打印的过程

【代码详解】

  1. 首先,我们定义了两个变量 ​​​​​​​languages ​​​​​​​和 ​​​​​​​years ,用于存储多个编程语言及其所属的年份信息
  2. 通过 for 循环遍历 languages ​​​​​​​和 ​​​​​​​years 中的所有元素
  3. 其中,遍历到的当前元素是通过 ​​​​​​​languages[i] ​​​​​​​和 ​​​​​​​years[i] ​​​​​​​表达的
  4. 因为 languages ​​​​​​​和 ​​​​​​​years 索引是对应的,所以在遍历时可以通过相同的 i 取得两个数组相同位置的元素
  5. for 循环语句之前,用方括号 ​​​​​​​​​​​​​​[] ​​​​​​​包含的表达式来创建了一个列表推导式;列表推导式表达式的作用是返回一个列表,其中包含遍历 languages ​​​​​​​和 ​​​​​​​years 列表时打印的信息
  6. for 循环中,使用类似于 lambda 表达式的一个匿名函数来执行列表推导式中的表达式;具体来说,这里使用了 print(languages[i],':', ​​​​​​​years[i]) 作为这个匿名函数的操作,它的作用是将当前遍历到的语言名称和对应的出现年份打印出来
  7. for 循环语句之后,不需要 print() 函数来显示输出打印内容,因为已经通过列表推导式将其自动处理输出了
  8. 这种写法相比于前一个代码片段,其实现原理是一模一样的,不过使用了列表推导式,没有显式使用循环语句,并且使用匿名函数取代了前一个代码片段中的变量赋值和打印语句。
  9. 相较于直接使用 for 循环语句或者迭代器实现打印输出,列表推导式使用匿名函数可读性较差,而且在处理较复杂的数据结构时也可能会清晰性下降。因此,是否使用列表推导式需要根据具体的应用场景、代码的可读性等多个方面进行权衡取舍。

【执行结果】

  • 将存储在两个列表变量 languages ​​​​​​​和 ​​​​​​​years 中的信息打印出来,每行表示一种编程语言和它的出现年份:
Regional Assembly Language : 1951
Autocode : 1952
FORTRAN : 1954
IPL (LISP的先驱) : 1954
FLOW-MATIC (COBOL的先驱) : 1955
COMTRAN (COBOL的先驱) : 1957
...

(2)错误写法 

① 写法 1

if __name__ == '__main__':
    # languages 和 years 列表
    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"]
    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]
    # 循环语句
    for language in languages:
        for year in years:
            # 打印输出
            print(language, ':', year)

【代码功能】

  • 展示了 Python 的基本语法和列表的使用方法,并使用 for 循环语句对两个列表中的数据进行了配对输出
  • 这种方法可以用来快速了解一系列数据的关系以及进行数据可视化等工作

【代码详解】

  1. 首先定义了两个列表:languages 和 years,其中 languages 存储了 60 多门编程语言的名称,years 存储了这些编程语言的诞生年份,两个列表中的数据一一对应
  2. 代码中使用了两层嵌套的 for 循环语句,在每次循环中将 languages 和 years 中的数据一一对应,并将其打印输出;代码执行后会输出 2484 行结果,每一行都包含一个编程语言和一个年份
  3. print 语句输出每一门编程语言和它的诞生年份;其中 : 是一个分隔符,用于将编程语言名称和年份隔开;输出格式为:编程语言名称 : 年份

【执行结果】

  • 这段代码的输出结果是把 languages 列表中每一门编程语言和 years 列表中每一年配对输出,总共输出了 2484 行结果,示例输出如下:
Regional Assembly Language : 1951
Regional Assembly Language : 1952
Regional Assembly Language : 1954
Regional Assembly Language : 1954
Regional Assembly Language : 1955
Regional Assembly Language : 1957
Regional Assembly Language : 1958
Regional Assembly Language : 1958
Regional Assembly Language : 1959
Regional Assembly Language : 1959
Regional Assembly Language : 1962
Regional Assembly Language : 1962
...
Go : 2001
Go : 2001
Go : 2002
Go : 2003
Go : 2003
Go : 2006
Go : 2006
Go : 2007
Go : 2009

【代码修正】

  • 如果要将输出内容限制在每个编程语言的第一年,可以在内层的循环中加入一个 break 语句,用于在打印完每个编程语言的第一个年份后终止该循环:
if __name__ == '__main__':
    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"]
    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]
    for language in languages:
        for year in years:
            print(language, ':', year)
            break if year == years[languages.index(language)]

【代码修正 · 运行结果】 

  • 改进后的代码在打印完每个编程语言的第一个年份后终止了内层循环,输出的结果就只包含每门编程语言的第一个年份
Regional Assembly Language : 1951
Autocode : 1952
FORTRAN : 1954
IPL (LISP的先驱) : 1958
FLOW-MATIC (COBOL的先驱) : 1955
COMTRAN (COBOL的先驱) : 1958
LISP : 1958
ALGOL 58 : 1958
FACT (COBOL的先驱) : 1963
COBOL : 1959
APL : 1962
...

猜你喜欢

转载自blog.csdn.net/qq_39720249/article/details/131132989