2022年9月26日星期一

Python-100 天/Day02 語言元素

   申明本站飛宇網 https://feiyetopro.blogspot.com/自網路收集整理之書籍文章影音僅供預覽交流學習研究,其[書籍、文章、影音]情節內容, 評論屬其個人行為, 與本網站無關。版權歸原作者和出版社所有,請在下載 24 小時內刪除,不得用作商業用途;如果您喜歡其作品,請支持訂閱購買[正版]謝謝!



Python-100 天

Day02 語言元素

指令和程序

電腦的硬體系統通常由五大部件構成,包括:運算器、控制器、記憶體、輸入裝置和輸出設備。其中,運算器和控制器放在一起就是我們通常所說的中央處理器,它的功能是執行各種運算和控制指令以及處理電腦軟體中的資料。我們通常所說的程式實際上就是指令的集合,我們程式就是將一系列的指令按照某種方式組織到一起,然後通過這些指令去控制電腦做我們想讓它做的事情。今天我們大多數時候使用的電腦,雖然它們的元器件做工越來越精密,處理能力越來越強大,但究其本質來說仍然屬於“馮·諾依” 《馮·諾諾的電腦。·諾依曼結構有兩個關鍵點,一是指出要將存放裝置與中央處理器分開,二是提出了將資料以二進位方式編碼。二進位是一種逢二進一的計數法,跟我們人類使用的逢十進一的計數法沒有實質性的區別,人類因為有十根手指所以使用了十進位(因為在數數時十根手指用完之後就只能進位了,當然凡事都有例外,瑪雅人可能是因為長年光著腳的原因把腳趾頭也算上了,於是他們使用了二十進位的計數法,在這種計數法的指導下瑪雅人的曆法就與我們平常使用的曆法不一樣,而按照瑪雅人的曆法,2012年是上一個所謂的太陽紀的最後一年,而2013年則是新的太陽紀的開始,後來這件事情被以訛傳訛的方式誤傳為2012年是瑪雅人預言的世界末日這種荒誕的說法,今天我們可以大膽的猜測,瑪雅文明之所以發展緩慢估計也與使用了二十進位有關)。對於電腦來說,二進位在物理器件上來說是最容易實現的(高電壓表示1,低電壓表示0),於是在·諾依曼結構的電腦都使用了二進位。雖然我們並不需要每個程式師都能夠使用二進位的思維方式來工作,但是瞭解二進位以及它與我們生活中的十進位之間的轉換關係,以及二進位與八進制和十六進位的轉換關係還是有必要的。如果你對這一點不熟悉,可以自行使用維基百科百度百科科普一下。

**說明**:近期關於**量子電腦**的研究已經被推倒了風口浪尖,量子電腦基於量子力學進行運算,使用量子瞬移的方式來傳遞資訊。20186月,Intel宣佈開發出新款量子晶片並通過了在接近絕對零度環境下的測試;2019年,IBMGoogle都推出了自己的量子電腦。

變量和類型

在程序設計中,變量是一種存儲數據的載體。計算機中的變量是實際存在的數據或者說是描述中存儲數據的空間空間變量,可以被讀取和修改,這是所有的計算和控制的基礎。計算機能夠處理的數據類型有很多種,除了數據類型之外還可以處理文本、圖形、音頻、視頻等各種不同的數據,那麼不同的數據就需要定義不同的存儲。Python中的數據類型很多,並且允許我們自定義新的數據類型(點在後面會講到),我們​​也先介紹幾種常用的數據類型。

  • 整型:Python中可以處理任意大小的整數(Python 2.x中有`int``long`兩種類型的整數,但這種區分對Python來說意義不大,因此在Python 3.x中整數只有int這一種了),而且支援二進位(如`0b100`,換算成十進位是4)、八進制(如`0o100`,換算成十進位是64)、十進位(`100`)和十六進位(`0x100`,換算成十進位是256)的標記法。

  • 浮點型:浮點數也就是小數,之所以稱為浮點數,是因為按照科學記數法表示時,一個浮點數的小數點位置是可變的,浮點數除了數學寫法(如`123.456`)之外還支持科學計數法(如`1.23456e2`)。

  • 字串型:字串是以單引號或雙引號括起來的任意文本,比如`'hello'``"hello"`,字串還有原始字串標記法、位元組字串標記法、Unicode字串標記法,而且可以書寫成多行的形式(用三個單引號或三個雙引號開頭,三個單引號或三個雙引號結尾)。
    -
    布林型:布林值只有`True``False`兩種值,要麼是`True`,要麼是`False`,在Python中,可以直接用`True``False`表示布林值(請注意大小寫),也可以通過布耳運算計算出來(例如`3 < 5`會產生布林值`True`,而`2 == 1`會產生布林值`False`)。

  • 複數型:形如`3+5j`,跟數學上的複數表示一樣,唯一不同的是虛部的`i`換成了`j`。實際上,這個類型並不常用,大家瞭解一下就可以了。

變量命名

對於每個變數我們需要給它取一個名字,就如同我們每個人都有屬於自己的響亮的名字一樣。在Python中,變數命名需要遵循以下這些必須遵守硬性規則和強烈建議遵守的非硬性規則。

  • 硬性規則:
    • 變量名由字母(廣義的Unicode字符,不包括特殊字符)、數字和下線構成,數字不能開頭。
    • 大小寫敏感(大寫的a和小寫A是兩種不同的變量)。
    • 不要跟關鍵字(有特殊含義的單詞,後面會講到)和系統保留字(如函數、模組等的名字)衝突。
  • PEP 8要求:
    • 用小寫拼寫,單詞用下劃線連接。
    • 受保護的屬性用單個下劃線開頭(後面會到)。
    • 私有的的實例屬性用兩個下線開頭(後面會講到)。

當然,作為一個專業的程式師,給變數(事實上應該是所有的識別字)命名時做到見名知意也是非常重要的。

變量的使用

下面通過幾個例子來說明變量的類型和變量使用。

"""
使用變量保存數據並進行加减乘除運算

Version: 0.1
Author: 飛宇
"""
a = 321
b = 12
print(a + b)    # 333
print(a - b)    # 309
print(a * b)    # 3852
print(a / b)    # 26.75

在 Python 中可以使用type函數對變量的類型進行程序設計中函數的概念與數學上函數的概念是一致的,數學上的函數的變量依賴於每個變量的檢查範圍,它包括了函數名、自變量和因變量的檢查範圍。如果暫時不理解概念,不要緊,我們會在也用於說明這個函數的定義和使用。

"""
使用type()檢查變數的類型

Version: 0.1
Author: 飛宇
"""
a = 100
b = 12.345
c = 1 + 5j
d = 'hello, world'
e = True
print(type(a))    # <class 'int'>
print(type(b))    # <class 'float'>
print(type(c))    # <class 'complex'>
print(type(d))    # <class 'str'>
print(type(e))    # <class 'bool'>

可以使用 Python 中構建的函數對變量類型進行轉換。

  • int()將一個數值或字串轉換成整數,可以指定進制。
  • float():將一個字串轉換成浮點數。
  • str():將指定的物件轉換成字串形式,可以指定編碼。
  • chr() :將整數轉換成該編碼對應的字串(一個字元)。
  • ord():將字串(一個字元)轉換成對應的編碼(整數)。

下面的代碼通過鍵盤輸入兩個整數來實現對兩個整數的算數運算

"""
使用input()函數獲取鍵盤輸入(字串)
使用int()函數將輸入的字串轉換成整數
使用print()函數輸出帶預留位置的字串

Version: 0.1
Author: 飛宇
"""
a = int(input('a = '))
b = int(input('b = '))
print('%d + %d = %d' % (a, b, a + b))
print('%d - %d = %d' % (a, b, a - b))
print('%d * %d = %d' % (a, b, a * b))
print('%d / %d = %f' % (a, b, a / b))
print('%d // %d = %d' % (a, b, a // b))
print('%d %% %d = %d' % (a, b, a % b))
print('%d ** %d = %d' % (a, b, a ** b))

**說明**:上面的print函數中輸出的字串使用了預留位置語法,其中`%d`是整數的預留位置,`%f`是小數的預留位置,`%%`表示百分號(因為百分號代表了預留位置,所以帶預留位置的字串中要表示百分號必須寫成`%%`),字串之後的`%`後面跟的變數值會替換掉預留位置然後輸出到終端中,運行上面的程式,看看程式執行結果就明白啦。

運算符

Python支持多種運算子,下表大致按照優先順序從高到低的順序列出了所有的運算子,運算子的優先順序指的是多個運算子同時出現時,先做什麼運算然後再做什麼運算。除了我們之前已經用過的設定運算子和算術運算子,我們稍後會陸續講到其他運算子的使用

運算符

描述
[] [:]下標,切片
**指數
~ + -按位取反,正負號
* / % //乘,除,模,整除
+ -加,減
>> <<右移,左移
&按位與
^ |按位異或,按位或
<= < > >=小於等於,小於,大於,大於等於
== !=等於,不等於
is is not身份運算子
in not in成員運算子
not or and邏輯運算子
`=` `+=` `-=` `*=` `/=` `%=` `//=` `**=` `&=` `|=` `^=` `>>=` `<<=`(複合)設定運算子        
  **說明:** 在實際開發中,如果搞不清楚運算子的優先順序,可以使用括弧來確保運算的      執行順序。

 賦值運算

賦值運算子應該是最為常見的運算子,它的作用是將右邊的值賦給左邊的變數。下面的例子演示了設定運算子和複合設定運算子的使用

"""
賦值運算符和複合賦值運算符

Version: 0.1
Author: 飛宇
"""
a = 10
b = 3
a += b        # 相當於:a = a + b
a *= a + 2    # 相當於:a = a * (a + 2)
print(a)      # 算一下這裡會輸出什麼

比較運算子和邏輯運算

比較運算子有的地方也稱為關係運算包括==!=<><=>= ,我相信沒有什麼好解釋的,大家一看就能懂,唯一需要提醒的是比較相等用的==,請注意這個地方是兩個等號,因=是設定運算子,我們在上面剛剛講到過,==才是比較相等的比較運算子。比較運算子會產生布林值,要麼是True要麼是False

邏輯運算子有三個,分別是`and``or``not``and`字面意思是而且,所以`and`運算子會連接兩個布林值,如果兩個布林值都是`True`,那麼運算的結果就是`True`;左右兩邊的布林值有一個是`False`,最終的運算結果就是`False`。相信大家已經想到了,如果`and`左邊的布林值是`False`,不管右邊的布林值是什麼,最終的結果都是`False`,所以在做運算的時候右邊的值會被跳過(短路處理),這也就意味著在`and`運算子左邊為`False`的情況下,右邊的運算式根本不會執行。`or`字面意思是或者,所以`or`運算子也會連接兩個布林值,如果兩個布林值有任意一個是`True`,那麼最終的結果就是`True`。當然,`or`運算子也是有短路功能的,在它左邊的布林值為`True`的情況下,右邊的運算式根本不會執行。`not`運算子的後面會跟上一個布林值,它的作用是得到與該布林值相反的值,也就是說,後面的布林值如果是`True`運算結果就是`False`,而後面的布林值如果是`False`則運算結果就是`True`

"""
比較運算符和邏輯運算符的使用
Version: 0.1
Author: 飛宇
"""
flag0 = 1 == 1
flag1 = 3 > 2
flag2 = 2 < 1
flag3 = flag1 and flag2
flag4 = flag1 or flag2
flag5 = not (1 != 2)
print('flag0 =', flag0)    # flag0 = True
print('flag1 =', flag1)    # flag1 = True
print('flag2 =', flag2)    # flag2 = False
print('flag3 =', flag3)    # flag3 = False
print('flag4 =', flag4)    # flag4 = True
print('flag5 =', flag5)    # flag5 = False
**說明**:比較運算子的優先順序高於設定運算子,所以`flag0 = 1 == 1`先做`1 == 1`產生布林值`True`,再將這個值賦值給變數`flag0``print`函數可以輸出多個值,多個值之間可以用`,`進行分隔,輸出的內容之間預設以空格分開。

練習

練習1:華氏溫度轉換為攝溫度。

提示:華氏溫度到攝氏溫度的轉換公式為:$C=(F - 32) \div 1.8$。

參考答案:

"""
将华氏温度转换为摄氏温度

Version: 0.1
Author: 飛宇
"""
f = float(input('請輸入華氏溫度: '))
c = (f - 32) / 1.8
print('%.1f華氏度 = %.1f摄氏度' % (f, c))

它的說明:在使用函數print的時候,也可以對字符串內容進行輸出。 ,後面用一個類型的變量值替換它,而會被字符串的替換掉。除了去掉特殊類型的字符外,還可以用下面的類型來命名字符串,和和可以先看一下和占位符的輸出時的替換時,後面的顯示這是一個數字值,然後顯示這個值是1個字符位,小數字點。print%.1ffloat%dint%s{f:.1f}{c:.1f}{f}{c}fc:.1f

print(f'{f:.1f}華氏度 = {c:.1f}摄氏度')

練習2:輸入圓的半徑計算計算周長和面積。

參考答案:

"""
輸入半徑計算圓的周長和面積

Version: 0.1
Author: 飛宇
"""
radius = float(input('請輸入圓的半徑: '))
perimeter = 2 * 3.1416 * radius
area = 3.1416 * radius * radius
print('周長: %.2f' % perimeter)
print('面積: %.2f' % area)

練習3:輸入年份判斷是不是閏年。

參考答案:

"""
輸入年份 如果是閏年輸出True 否則輸出False

Version: 0.1
Author: 飛宇
"""
year = int(input('請輸入年份: '))
# 如果代碼太長寫成一行不便於閱讀 可以使用\對代碼進行折行
is_leap = year % 4 == 0 and year % 100 != 0 or \
          year % 400 == 0
print(is_leap)

計算結果:比較運算子會產生布林值,而邏輯運算子`and``or`會對這些布林值進行組合,最終也是得到一個布林值,閏年輸出`True`,平年輸出`False`

 

0 留言:

發佈留言