Python程式筆記20230306

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

判斷閏年 初始版本 year = input('請輸入一個年份:') while not year.isdigit(): year = input("抱歉,您的輸入有誤,請輸入一個整數:") year = int(year) if year % 400 == 0: print(year, "是閏年! ...


判斷閏年

初始版本

year = input('請輸入一個年份:')

while not year.isdigit():
    year = input("抱歉,您的輸入有誤,請輸入一個整數:")

year = int(year)
if year % 400 == 0:
    print(year, "是閏年!")
else:
    if year % 4 == 0 and year % 100 != 0:
        print(year, "是閏年!")
    else:
        print(year, "不是閏年!")

isdigit()函數

isdigit() 是 Python 字元串對象的方法,用於判斷字元串是否只包含數字字元。該方法返回一個布爾值,如果字元串中所有字元都是數字,則返回 True,否則返回 False。如果字元串為空,則返回 False。

my_string = "12345"
print(my_string.isdigit()) # 輸出 True

my_string = "123abc"
print(my_string.isdigit()) # 輸出 False

my_string = ""
print(my_string.isdigit()) # 輸出 False

在實際編程中,可以使用 isdigit() 來檢查輸入的是否是數字,以確保輸入的是有效數據。例如,在一個需要輸入數字的程式中,可以使用 isdigit() 來驗證用戶的輸入是否為數字,如果不是,則提示用戶重新輸入。

優化版本

將判斷閏年的邏輯封裝到一個函數中,這樣使得程式結構更加清晰。另外,對於輸入的異常處理,可以考慮添加一個迴圈讓用戶在輸入錯誤時可以重新輸入,而不是只提示一次。這是一個修改後的版本:

def is_leap_year(year: int) -> bool:
    if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
        return True
    return False


def get_year_input(prompt: str) -> int:
    while True:
        year = input(prompt)
        if year.isdigit():
            return int(year)
        else:
            print("抱歉,您的輸入有誤,請輸入一個正整數。")


def main():
    year = get_year_input("請輸入一個年份:")
    if is_leap_year(year):
        print(year, "是閏年!")
    else:
        print(year, "不是閏年!")


if __name__ == "__main__":
    main()

語法分析

def is_leap_year(year: int) -> bool

  • year: int 是一個類型提示註釋,用於告訴程式員和解釋器該函數的參數 year 應該是一個整數類型。
  • -> 的語法是一種函數註解(function annotation),它可以用來為函數的參數和返回值添加一些元數據,比如類型、描述等。函數註解是可選的,它不會影響函數的執行,也不會強制類型檢查,它只是提供了一些額外的信息,方便閱讀和理解代碼。你可以使用 __annotations__ 屬性來訪問函數的註解。例如:
# 定義一個帶有註解的函數
def is_leap_year(year: int) -> bool:
    if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
        return True
    return False

# 查看函數的註解
print(is_leap_year.__annotations__)

輸出結果:

{'year': <class 'int'>, 'return': <class 'bool'>}

這個例子中,-> bool 表示這個函數的返回值是一個布爾值,year: int 表示這個函數的參數 year 是一個整數。這樣,其他人在閱讀或調用這個函數時,就可以清楚地知道這個函數的輸入和輸出類型。當然,你也可以使用其他類型或表達式作為註解,比如字元串、列表、字典等,只要它們是合法的 python 表達式即可。你也可以使用 typing 模塊中的一些特殊類型來表示更複雜的類型,比如 Union、Optional、List 等。

Python 安裝互動式查詢程式

問題展現

Python 歷史上有幾個重要的版本節點:

  • January 1994,Python1.0 發佈
  • 2000年10月16日,Python2.0 發佈
  • 2010年7月3日,Python2.7 發佈,這是Python2.x的最後一個版本,Python2.x 和 Python3.x不相容
  • 2008年12月3日,Python3.0 發佈,Python3引入多個和Python2.x不相容的特性,Python 從2.x到3.x的遷移經歷了比較長的時間,編程語言版本不相容有時候會是個致命錯誤(例如Perl6),好在Python挺過來了。
  • 2021年10月5號,Python3.10 發佈,這是目前到2021年為止最新的版本
  • 而最新的開發中版本是 Python3.11

不同平臺對Python環境的預設支持是不同的:

  • Windows 平臺沒有預設安裝 Python
  • Linux/Mac 平臺大部分預設安裝了 Python2.7

一般建議安裝Python3.x 版本進行學習或開發。下麵的Python字典給出了不同平臺的安裝信息:

install = {
    "Windows": "請下載 Windows 安裝包安裝:https://www.python.org/downloads/windows/",
    "CentOS": "使用yum包管理器,執行命令:yum install -y python3",
    "Ubuntu": "使用apt-get包管理器,執行命令:apt-get install -y python3",
    "MacOS": "安裝brew包管理器,然後執行命令: brew install python3",
}

基於這個信息,我們可以編寫一個互動式Python程式,要求支持用戶操作

  • 反覆輸入平臺快捷鍵字元查詢不同平臺應該如何快速安裝 Python3.x 版本
  • q退出查詢
if __name__ == '__main__':
    install = {
        "Windows": "請下載 Windows 安裝包安裝:https://www.python.org/downloads/windows/",
        "CentOS": "使用yum包管理器,執行命令:yum install -y python3",
        "Ubuntu": "使用apt-get包管理器,執行命令:apt-get install -y python3",
        "MacOS": "安裝brew包管理器,然後執行命令: brew install python3",
    }

    shortcut_keys = {}
    for platform in install:
        key = platform[0].lower()
        shortcut_keys[key] = platform
    
    # TODO(You): 請在此添加Python3.x安裝文檔互動式查詢代碼

以下是互動式執行的操作樣例:

請選擇安裝平臺[w/c/u/m, 按q退出]:w
Windows: 請下載 Windows 安裝包安裝:https://www.python.org/downloads/windows/
請選擇安裝平臺[w/c/u/m, 按q退出]:c
CentOS: 使用yum包管理器,執行命令:yum install -y python3
請選擇安裝平臺[w/c/u/m, 按q退出]:u
Ubuntu: 使用apt-get包管理器,執行命令:apt-get install -y python3
請選擇安裝平臺[w/c/u/m, 按q退出]:m
MacOS: 安裝brew包管理器,然後執行命令: brew install python3
請選擇安裝平臺[w/c/u/m, 按q退出]:q

解決方案

方案 1

while True:
    ret = input("請選擇安裝平臺[w/c/u/m, 按q退出]:")
    if ret != 'q':
        platform = shortcut_keys.get(ret)
        if platform is not None:
            doc = install.get(platform)
            print(f"{platform}: {doc}")
        else:
            print("不支持的平臺")
    else:
        break

方案 2

while True:
    ret = input("請選擇安裝平臺[w/c/u/m, 按q退出]:")
    platform = shortcut_keys.get(ret)

    if ret == 'q':
        break
    
    if platform is None:
        print("不支持的平臺")
        continue
    
    doc = install.get(platform)
    print(f"{platform}: {doc}")

方案 3

while True:
    ret = input("請選擇安裝平臺[w/c/u/m, 按q退出]:")
    if ret == 'q':
        break
    platform = shortcut_keys.get(ret)
    if platform is None:
        print("不支持的平臺")
    else:
        doc = install.get(platform)
        print(f"{platform}: {doc}")

重點語法分析

shortcut_keys = {}
for platform in install:
    key = platform[0].lower()
    shortcut_keys[key] = platform
shortcut_keys = {platform[0].lower(): platform for platform in install}

兩段代碼的目的都是根據 install 字典創建一個新的 shortcut_keys 字典,鍵是平臺名字的首字母的小寫形式,值是完整的平臺名字。

第一段代碼:使用了一個 for 迴圈來遍歷 install 字典的鍵(即平臺名字)。對於每個平臺名字,它首先提取平臺名字的第一個字元(platform[0]),然後將其轉換為小寫形式(platform[0].lower()),並將其作為新字典 shortcut_keys 的鍵。接著,它將完整的平臺名字作為鍵對應的值。這樣,我們就得到了一個與 install 字典具有相同值但鍵不同的新字典。
在這一段 python 語句中,shortcut_keys = {} 用的是大括弧{},是因為 shortcut_keys 是一個字典(dictionary)。字典是一種用來存儲鍵值對(key-value pairs)的數據結構,它們用大括弧{}來表示。字典的鍵(key)可以是任何不可變的類型,比如字元串、數字或元組,而值(value)可以是任何類型,比如列表、函數或對象。字典的元素可以通過鍵來訪問,而不是通過索引(index)。例如,shortcut_keys[‘i’] 會返回 install 這個值。

第二段代碼:這段代碼使用了字典推導(dictionary comprehension),它是一種更簡潔的創建字典的方法。字典推導的語法類似於列表推導,但使用大括弧 {}(而不是方括弧 []),併在其內部包含鍵值對(而不是單個元素)。
字典推導的基本結構是:{key_expression: value_expression for item in iterable}
在這個例子中,key_expressionplatform[0].lower()value_expressionplatformiterableinstall。這個字典推導的含義是:對於 install 字典的每個鍵(即平臺名字 platform),創建一個鍵值對,鍵是 platform[0].lower(),值是 platform。這樣,我們得到了與第一段代碼相同的結果。

優化結果

if __name__ == '__main__':
    install = {
        "Windows": "請下載 Windows 安裝包安裝:https://www.python.org/downloads/windows/",
        "CentOS": "使用yum包管理器,執行命令:yum install -y python3",
        "Ubuntu": "使用apt-get包管理器,執行命令:apt-get install -y python3",
        "MacOS": "安裝brew包管理器,然後執行命令: brew install python3",
    }

    shortcut_keys = {platform[0].lower(): platform for platform in install}

    while True:
        platform_input = input("請選擇安裝平臺[w/c/u/m, 按q退出]:")
        if platform_input.lower() == 'q':
            break

        platform = shortcut_keys.get(platform_input.lower())
        if platform:
            print(f"{platform}: {install[platform]}")
        else:
            print("輸入有誤,請重新輸入。")

可以考慮將用戶輸入和指令顯示的功能封裝到函數中,以提高代碼的可讀性。

def display_install_instructions(install_dict, shortcut_keys):
    while True:
        platform_input = input("請選擇安裝平臺[w/c/u/m, 按q退出]:")
        if platform_input.lower() == 'q':
            break

        platform = shortcut_keys.get(platform_input.lower())
        if platform:
            print(f"{platform}: {install_dict[platform]}")
        else:
            print("輸入有誤,請重新輸入。")


if __name__ == "__main__":
    install = {
        "Windows": "請下載 Windows 安裝包安裝:https://www.python.org/downloads/windows/",
        "CentOS": "使用yum包管理器,執行命令:yum install -y python3",
        "Ubuntu": "使用apt-get包管理器,執行命令:apt-get install -y python3",
        "MacOS": "安裝brew包管理器,然後執行命令: brew install python3",
    }

    shortcut_keys = {platform[0].lower(): platform for platform in install}
    display_install_instructions(install, shortcut_keys)

字典和列表

字典(dictionary)和列表(list)都是 Python 中常用的數據結構,但它們之間存在一些關鍵的區別:

  1. 鍵值對 vs. 有序元素集合:
    • 字典是一個基於鍵值對(key-value pair)的無序集合。在字典中,每個元素都有一個唯一的鍵(key)與之對應。字典中的元素通過鍵來訪問,而不是通過索引。
    • 列表是一個有序的元素集合。列表中的元素可以通過索引訪問,索引從 0 開始,按元素在列表中的順序遞增。
  2. 可變性:
    • 字典和列表都是可變的(mutable),這意味著它們的內容可以在運行時修改。
  3. 查找速度:
    • 字典使用散列(hashing)技術,因此在查找特定鍵時,字典的查找速度通常非常快。字典的查找速度與字典的大小無關。
    • 列表查找元素的速度通常較慢,尤其是在大型列表中。列表的查找速度取決於列表的大小。
  4. 語法:
    • 字典使用大括弧 {} 來創建,每個元素由鍵和值組成,鍵值對之間用冒號 : 分隔,元素之間用逗號 , 分隔。例如:{'key1': 'value1', 'key2': 'value2'}
    • 列表使用方括弧 [] 來創建,元素之間用逗號 , 分隔。例如:[1, 2, 3, 4]

常用的列表(list)和字典(dictionary)的操作方法:

列表(list)操作

  1. 創建列表:
    my_list = [1, 2, 3, 4]

  2. 訪問列表元素:
    first_element = my_list[0] second_element = my_list[1]

  3. 修改列表元素:
    my_list[0] = 10 my_list[1] = 20

  4. 添加元素到列表末尾:
    my_list.append(5)

  5. 在列表指定位置插入元素:
    my_list.insert(1, 1.5)

  6. 從列表中刪除元素(通過索引):
    del my_list[0]

  7. 從列表中刪除元素(通過值):
    my_list.remove(2)

  8. 彈出列表中的最後一個元素:
    last_element = my_list.pop()

  9. 彈出列表中的指定位置的元素:
    second_element = my_list.pop(1)

  10. 列表切片(截取列表的一部分):
    sublist = my_list[1:3]

  11. 列表排序(從小到大):
    my_list.sort()

  12. 列表反轉:
    my_list.reverse()

  13. 計算列表中元素的個數:
    length = len(my_list)

  14. 計算列表中特定元素出現的次數:
    count = my_list.count(2)

  15. 查找列表中特定元素的索引(如果元素不存在,會拋出異常):
    index = my_list.index(3)

  16. 列表拼接:
    list1 = [1, 2, 3] list2 = [4, 5, 6] combined_list = list1 + list2

  17. 列表複製:
    copied_list = my_list.copy()

  18. 清空列表:
    my_list.clear()

字典(dictionary)操作

  1. 創建字典:
    my_dict = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

  2. 訪問字典元素:
    value1 = my_dict['key1']
    value2 = my_dict['key2']

  3. 修改字典元素:
    my_dict['key1'] = 'new_value1'
    my_dict['key2'] = 'new_value2'

  4. 添加新的鍵值對到字典:
    my_dict['key4'] = 'value4'

  5. 從字典中刪除鍵值對:
    del my_dict['key1']

  6. 檢查字典中是否存在某個鍵:
    if 'key1' in my_dict: print("Key 'key1' exists in the dictionary.")

  7. 獲取字典中所有的鍵:
    keys = my_dict.keys()

  8. 獲取字典中所有的值:
    values = my_dict.values()

  9. 獲取字典中所有的鍵值對(元組形式):
    items = my_dict.items()

  10. 使用get()方法訪問字典元素(如果鍵不存在,返回預設值):
    value1 = my_dict.get('key1', 'default_value')

  11. 使用 update() 方法將另一個字典的鍵值對合併到當前字典中(如果有重覆的鍵,當前字典的值將被覆蓋):
    another_dict = {'key5': 'value5', 'key6': 'value6'} my_dict.update(another_dict)

  12. 使用pop()方法刪除並返回字典中指定鍵的值(如果鍵不存在,返回預設值或拋出異常):
    value3 = my_dict.pop('key3', 'default_value')

  13. 使用popitem()方法刪除並返回字典中最後一個鍵值對(如果字典為空,拋出異常):
    last_item = my_dict.popitem()

  14. 設置字典中指定鍵的預設值(如果鍵已經存在,則不修改其值):
    my_dict.setdefault('key1', 'default_value1')

  15. 清空字典:
    my_dict.clear()


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

-Advertisement-
Play Games
更多相關文章
  • Python使用基本規 (一)、關於註釋 註釋是編程語言必備的,以下是幾種常用的註釋方式。 1 # 這是單行註釋 2 3 4 ''' 這是多行註釋1 ''' 5 6 7 """ 這是多行註釋2 """ (二)、關於列印 與C#中的WriteLine相似,Python中Print 的輸出是預設換行的, ...
  • 前言 在上一篇文章中,我們介紹了^運算符的高級用法,本篇文章,我們將介紹~ 運算符的一些高級用法。 一、人物簡介 第一位閃亮登場,有請今後會一直教我們C語言的老師 —— 自在。 第二位上場的是和我們一起學習的小白程式猿 —— 逍遙。 二、相反數 我們可以利用負數的補碼性質,來獲得一個正數的相反數 # ...
  • 經過了幾天的奮戰,終於把微信服務號的模板消息給寫完了。後端其實沒花多少時間,因為之前已經有同學提過pull request了,我在這基礎之上簡單優化下就完事了,主要的時間都是花在前端上,對前端頁面和參數的適配比較麻煩。 消息推送平臺🔥推送下發【郵件】【簡訊】【微信服務號】【微信小程式】【企業微信】 ...
  • 1、概念:docker是一個開源的應用容器引擎,docker可以讓開發者打包他們的應用以及依賴環境包到一個輕量級、可移值的容器中。然後發佈到任何流行的linux機器上。 安裝過程: 1、yum包更新到最新 yum update 2、安裝需要的軟體包 yum install -y yum-utils ...
  • 長字元串起因 項目裡面有一長串的加密字元串(最長的萬多個字元),需要拼接作為參數發送給第三方。 如果我們使用 枚舉 定義的話,idea 編譯的時候就會出現編譯報錯 Error: java:常量字元串過長 解決想法 網上還有一個說法,說是編譯器問題,修改 idea 工具的編譯為 eclipse 即可。 ...
  • 說下場景,我的程式在多線程場景下一個迴圈體中處理業務數據,其中需要調用一個外部http介面去獲取一些數據,程式總會在在本地執行一段時間後會拋出Address already in use: no further information錯誤。 這是大量併發場景下出現的問題,經過查閱原因是OkHttp的 ...
  • 文件操作 文件讀寫 語法:open(file, mode, encoding) 參數:file —— 文件所在位置(相對路徑、絕對路徑) mode —— 操作文件的模式 encoding —— 文件的編碼格式 相對路徑:基於目前的路徑獲取 絕對路徑:一個完整的路徑 操作文件的模式:r-讀 w-寫 a ...
  • 前言 做了個python的小項目,需要打包為桌面端的exe使用,結果一打包,體積直接上百兆了,研究了下,使用虛擬環境打出的包會更乾凈小巧。 安裝anaconda(用作python的虛擬環境管理工具) 安裝:https://repo.anaconda.com/archive/Anaconda3-202 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...