Python程式筆記20230301

来源:https://www.cnblogs.com/taurusxw/archive/2023/04/11/17305712.html
-Advertisement-
Play Games

列印九九乘法表 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。

  1. 生成從0到5的整數序列:range(6)
  2. 生成從2到10的偶數序列:range(2, 11, 2)
  3. 生成從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,這個參數是由一個名字和成就組成的字元串,中間由逗號分隔。函數返回一個包含兩個元素的元組,第一個元素是名字,第二個元素是成就,都去掉了開頭和結尾的空格。

具體的實現過程如下:

  1. 使用字元串方法 find() 查找逗號在字元串 creator 中的位置,並返回它的索引。
  2. 使用字元串切片的方式,將名字和成就從 creator 中分離出來。這裡使用逗號的索引將字元串 creator 分成了兩個部分,前面的部分是名字,後面的部分是成就。
  3. 使用字元串方法 strip() 將名字和成就的開頭和結尾的空格去掉。
  4. 將名字和成就組成一個元組並返回。

例如,如果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 的函數,用於解析程式員的名字。下麵是代碼的詳細解釋:

  1. def parse_name(name)::定義函數 parse_name,它接收一個名字字元串 name 作為參數。
  2. index = name.find('('):查找名字字元串中左括弧 ( 的位置,返回其索引值,賦值給變數 index
  3. name_cn, name_en = name[0:index], name[index:]:使用括弧中的索引值 index 將名字字元串分割為中文名和英文名兩部分,中文名存儲在變數 name_cn 中,英文名存儲在變數 name_en 中。
  4. name_en = name_en[1:len(name_en)-1]:將英文名字元串的第一個字元和最後一個字元(即左右括弧)去除,得到真正的英文名。
  5. 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 迴圈和列表追加合併為一行代碼,使得代碼更加簡潔和可讀性更高。此外,它也更加函數化,將創建每個開發者簡介的過程分離到單獨的函數中,提高了代碼的可維護性和可擴展性。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SpringCloud OpenFeign-服務調用 1.OpenFeign介紹 https://github.com/spring-cloud/spring-cloud-openfeign OpenFeign是一個聲明式WebService客戶端,使用OpenFeign讓編寫Web Service ...
  • 說明 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。本篇介紹使用 VLD 時的註意事項。同系列文章目錄可見 《記憶體泄漏檢測工具》目錄 1. 官網文檔 可以在 Using-Visual-Leak-Detector 官方文檔里看到如何使用 VLD。 2. 註意事項 以 v2.5.1 版本為例, ...
  • 線程池ThreadPoolExecutor ThreadPoolExecutor 繼承結構 繼承結構如圖所示:ThreadPoolExecutor <- AbstractExecutorService <- ExecutorService <- Executor public class Threa ...
  • Map ​ 哈希表是一種巧妙並且實用的數據結構。它是一個無序的key/value對的集合,其中所有的key 都是不同的,然後通過給定的key可以在常數時間複雜度內檢索、更新或刪除對應的value。 ​ 在Go語言中,一個map就是一個哈希表的引用,map類型可以寫為map[K]V,其中K和V分別 對 ...
  • MongoDB索引優化 作者: 博學谷狂野架構師 GitHub:GitHub地址 (有我精心準備的130本電子書PDF) 只分享乾貨、不吹水,讓我們一起加油!😄 索引簡介 索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數據時必須掃描集合中的每個文件並選取那些符合查詢條件的記錄 ...
  • 面向對象封裝特點之一就是通過實現好的方法來訪問,限制對數據的不合理訪問,把對象狀態私有化,僅供類的內部進行操作 下方示例,Test方法的number屬性類實例的時候傳遞1,number是一個公開屬性,可以在外部任意修改、訪問,沒有對屬性進行進行約束 class Test: def __init__( ...
  • 當前主流編程語言的垃圾收集器基本上都是依靠可達性分析演算法來判定對象是否存活的,可達性分析演算法理論上要求全過程都基於一個能保障一致性的快照中才能夠進行分析,這意味著必須全程凍結用戶線程的運行。 在根節點枚舉這個步驟中,由於 GC Roots 相比起整個 Java 堆中全部的對象畢竟還算是極少數,且在各 ...
  • 大家好,我是三友~~ 前幾天有個大兄弟問了我一個問題,註冊中心要集成SpringCloud,想實現SpringCloud的負載均衡,需要實現哪些介面和規範。 既然這個兄弟問到我了,而我又剛好知道,這不得好好寫一篇文章來回答這個問題,雖然在後面的聊天中我已經回答過了。 接下來本文就以探究一下Nacos ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...