Python的基礎語法(二)

来源:https://www.cnblogs.com/lucas27171/archive/2019/04/18/10733032.html
-Advertisement-
Play Games

0. 前言 接著上一篇 "博客" 的內容,我將繼續介紹Python相關的語法。部分篇章可能不只是簡單的語法,但是對初學者很有幫助,也建議讀懂。 1. 表達式 由數字、符號、括弧、變數等組成的組合。 算術表達式 邏輯表達式 賦值表達式 在Python中,變數無需實現聲明,也不需要指定類型。 在Pyth ...


0. 前言

接著上一篇博客的內容,我將繼續介紹Python相關的語法。部分篇章可能不只是簡單的語法,但是對初學者很有幫助,也建議讀懂。

1. 表達式

由數字、符號、括弧、變數等組成的組合。

  • 算術表達式
  • 邏輯表達式
  • 賦值表達式
  • 在Python中,變數無需實現聲明,也不需要指定類型。
a = 1   # 無需聲明和指定類型

在Python中,賦值即定義,如果一個變數已經定義,賦值相當於重新定義。

2. 記憶體管理

在其他語言,如C++和C中,記憶體管理是非常重要的,因為在一段記憶體地址被釋放之後,記憶體中會留下一個“空洞”,造成記憶體碎片化。通常地,開發者會利用特定的策略來管理記憶體,把需要經常變動的值放到一個區域,靜態的值放到另一個區域。開發者手動管理維護記憶體,不僅麻煩,還很容易留下安全隱患。

在Python編程中無須關心變數的存亡,也不關心記憶體的管理。Python語言和Java一樣,採用了類似的垃圾收集的機制(Garbage Collection)。

簡單的理解:首先,在Python中,一切皆對象。Python使用引用計數ob_refcnt記錄所有對象的引用數。當對象引用數ob_refcnt變為0,它就被認為是生命結束了,記憶體也會被回收。例如在函數運行結束時,局部變數就會被自動銷毀,記憶體被回收。變數賦值給其他對象時,記憶體被回收。下麵舉一個例子:

num1 = 12   # 定義一個變數,這時候在記憶體中存放12這個值,num標識符對它進行引用,ob_refcnt=1
num2 = num1 # 現在num2和num1的值都在同一個地址,它被引用的次數為2,ob_refcnt=2

# 現在對上面兩個變數重新賦值,也就是相當於重新定義
num1 = 1
num2 = 2
# 這個時候,剛纔的記憶體中的12,因為被引用的次數為0,也就是ob_refcnt=2,那麼記憶體就被回收了

缺點:記憶體回收機制(Grabage Collection)因為是自動的,所以效率註定不高,在對程式性能要求高的環境中,這一點是致命的。 (不過也還是可以自己動手調一下的,這裡暫時不提)

作為初學入門的同學,先瞭解這麼多就可以了,如果想再全面地瞭解,這裡推薦一篇博客我認為寫得挺好的,以供參考。[點擊這裡]

3. 程式控制

3.1 順序結構

所謂順序結構,也就是串列。就是一條一條語句按照順序執行。比如:先洗手,再吃飯,再洗碗。

# 下麵三種行為按照從上到下的順序執行
washing_hand()  # 洗手
eat()           # 吃飯
washing_dishes()    #洗碗

3.2 分支結構

分支結構:根據不同情況判斷,條件滿足執行某條件下的語句。

3.2.1 if...else...語句

比如,小明考試及格,就吃金拱門,考試不及格,就罰做家務。

if score >= 60: # 這裡設置60分為及格
    eat_KFC()   # 及格了就吃金拱門
else:   # 否則
    do_housework() # 不及格就做家務

if...else...就是Python中用作判斷的語句。if後面的條件語句就是判斷的依據,它返回的是一個布爾值。而if下麵的都是代碼塊,是在if條件語句為True的時候,才會執行。

3.2.2 if...elif...else...語句

上面的例子是單分支結構,要實現多分支結構該怎麼辦呢?下麵有一個例子:

myScore = 58
if myScore >= 80 and myScore<=100:
    print("Good.")  # 八十分以上,優秀
elif myScore >=60 and myScore <80:
    print("Pass.")  # 六十分以上,及格
elif myScore<60 and myScore>=0:
    print("Fail.")  # 六十分以下,不及格
else:               # 在上麵條件之外的,也就是小於0分或者大於100分了,那麼就算做是錯誤分數了
    print("錯誤分數")

有部分情況下,條件語句並沒有返回一個__布爾值__怎麼辦呢?在Python中,如果在if後面的條件語句沒有返回一個布爾值,那麼它會把這個語句放進bool()函數中進行轉換,轉換後就會返回一個布爾值了。

if 3:   # 這裡的3並不是一個條件語句,它經過bool()函數轉換成布爾值,但是這個操作是我們看不到的
    print('True')
else:
    print('False')

下麵,給出一些常見的對象/常量經過bool()函數轉換後的值,以供參考

對象/常量
“”-空字元串
“string”-非空字元串
0
非0 - 一個非0實數
()空元組
[]空列表
{}空字典
None

3.3 迴圈結構

迴圈結構:條件滿足就反覆執行,不滿足就不執行或不再執行。

3.3.1 while語句

比如,小明在七點前要寫作業,小明在7點之後可以看電視,所以他隔一會就檢查一次。

time = 5
while time<7:   # 這是一個迴圈體,如果time<7,就會一直迴圈
    do_homework()   # 七點前做作業
    time += 1       # 每一次迴圈加一個小時
watching_tv()   # 跳出迴圈之後就執行看電視操作了

和if...else..結構類似,while下麵的語句塊也是在條件滿足的時候執行,直到條件不滿足後退出。

3.3.2 for語句

還有另一個語句可以實現迴圈結構——for語句。他的結構是這樣的:

for element in sequence:    # 當可迭代對象中有元素可以迭代,進入迴圈體,執行block
    block

上面所提到的可迭代對象,簡單理解可以說是一組元素,比如[1, 2, 3]

首先,先介紹一下range(start, stop[, step])函數。
參數說明:

  • start: 計數從 start 開始。預設是從 0 開始。例如range(5)等價於range(0, 5);
  • stop: 計數到 stop 結束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]沒有5
  • step:步長,預設為1。例如:range(0, 5) 等價於 range(0, 5, 1)

下麵再舉個for迴圈的例子:

for i in range(10): 
    print(i)
    
執行結果:
0
1
2
3
4
5
6
7
8
9

迴圈一共執行了10次,每一次i獲取range(10)返回的列表中的一個元素。直到range(10)的元素被獲取完了,迴圈就結束了。

3.3.3 continue語句

continue語句的作用是:中斷當前迴圈的當次操作,繼續下一次迴圈,如果沒有下一次迴圈就結束迴圈。舉例,列印10以內的偶數:

for i in range(10):
    if i % 2 == 1:
        continue
    print(i)

3.3.4 break語句

break語句:終止當前迴圈,跳出迴圈體。

舉例: 列舉1000以內被7整除的前20個數

count = 0   # count是一個計數器
for i in range(0, 1000, 7):
    print(i)
    count += 1      # 每次列舉一個數就加1
    if count >=20:      # 如果count大於等於20
        break       # 終止當前迴圈,跳出迴圈體

註:迴圈被break打斷叫不正常結束,else子句無效

3.3.5 迴圈 else子句

在while和for後面跟著的一個子句,結構如下

while condition:
    block
else:       # 在while迴圈正常結束後執行else裡面的代碼塊
    block

for element in sequence:
    block
else:       # 在for迴圈正常結束後執行else裡面的代碼塊
    block

迴圈異常拋出也是不正常結束,else子句無效。這種子句在特定情況下很有用,比如用於檢測迴圈是否正常結束。

3.4 嵌套結構

上面我們說的分支和迴圈,都是可以嵌套的。什麼是嵌套呢?下麵舉個例子,判斷一個數為幾位數:

print("輸入一個0-99999的數")
num = input(">>")   # input()函數用作讀取鍵盤輸入
num = int(num)      # input()函數讀取的輸入為字元串類型,因為Python是強類型語言,所以這裡要做一個類型轉換,轉換為整型
if num >= 1000:
    if num >=10000:
        print(5)
    else:
        print(4)
else:
    if num >= 100:
        print(3)
    elif num >= 10:
        print(2)
    else:
        print(1)

在if...else...中又插入一個或多個if...else...,這種方式就叫做嵌套。

上面的例子中,我並不是從五位數到四位數到三位數這樣一路判斷下來的,一方面是為了演示嵌套結構,另一方面,我這裡用到了二分搜索演算法,這種演算法從中間開始查找,如果是判斷一個一百位數,或者一千位數,這樣的演算法明顯會比順序查找高效得多。在以後的博客,我會再具體介紹演算法相關的內容。

以上為Python基礎語法的第二部分,下一個部分將在下一篇博客中介紹。


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

-Advertisement-
Play Games
更多相關文章
  • php與mysql資料庫,PHP支持很多資料庫,與mysql為牛逼組合,mysql資料庫的基礎知識的掌握是由必要的,要瞭解如何操作mysql資料庫,數據表的方法。 什麼是資料庫,資料庫能做什麼,資料庫有什麼好處,資料庫的基礎必備技術,備份和恢復的方法。 mysql的好處,功能強大,支持跨平臺,運行速 ...
  • 進行文件上傳前需要添加相應的依賴 在xml文件中進行相應的文件上傳解析器的配置 註意:這裡有個坑,因為沒註意,再排查錯誤的時候花了一點時間。就是給bean的id一定要是。 否者就會報如下的錯誤: ...
  • 1,今日內容: 二,深淺拷貝 三,元組類型 四,字典類型 五,字典的定義 六,字典的操作 七,集合類型 ...
  • 關於SpringMVC頁面向Controller傳參的問題,看了網上不少帖子,大多總結為以下幾類: 1、直接把頁面表單中相關元素的name屬性對應的值作為Controller方法中的形參。 這個應該是最直接的,我看的那本書從百度的編輯器中取內容content時就直接用的這個方法: 2、通過@Requ ...
  • 一、什麼是進程 進程(Process)是電腦中的程式關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的電腦結構中,進程是程式的基本執行實體;在當代面向線程設計的電腦結構中,進程是線程的容器。程式是指令、數據及其組織形式的描述,進程是程 ...
  • In many programming competitions, we are asked to find (or count the number of) Prime Factors of an integer i. This is boring. This time, let’s count ...
  • 字元串是一種非常重要的數據類型,但是C語言不存在顯式的字元串類型,C語言中的字元串都以字元串常量的形式出現或存儲在字元數組中。同時,C 語言提供了一系列庫函數來對操作字元串,這些庫函數都包含在頭文件 string.h 中。 一、字元串常量和字元數組 1.1、什麼是字元串常量 C 語言雖然沒有字元串類 ...
  • ConcurrentSkipListSet的底層是ConcurrentSkipListMap嗎? ConcurrentSkipListSet是線程安全的嗎? ConcurrentSkipListSet是有序的嗎? ConcurrentSkipListSet和之前講的Set有何不同? ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...