1.1 編程語言和python介紹
計算機分為軟件和硬件,硬件就是我們看得見,摸得着的,比如顯示器,鼠標,鍵盤,CPU,內存,硬盤。
軟件是一段數據,存儲在內存或硬盤,這段數據記錄了一段指令,通過這些指令來操作計算機硬件。
開發軟件就是開發一套機器能識別指令來完成特定的功能,這個的過程被稱為編程,編程所使用的工具是編程語言。
1.1.1 機器指令與匯編語言
編程語言最初是直接用機器指令,通常是一段二進制數據,如0101..,機器指令很直接,直接就可以操縱硬件
比如讓CPU運行加減,乘除,讓內存存儲數據。
掌握了機器指令,相當於直接和硬件對話,讓硬件做什么就做什么,但是,機器指令是由一個個0101之類的二進制數構成,
掌握機器指令,過於復雜又難以記憶。於是有人就發名了一種助記符,把英語單詞和機器指令對應起來。
如下面的表格
功能 | 機器指令 | 助記符 |
---|---|---|
加 | 0100 | ADD |
減 | 0101 | SUB |
這樣以后再編寫程序就可以不用0100來表示加法了,而是使用助記符ADD來編寫,這樣,可以讓編寫程序的人輕松不少,最后再統一替換成對應的二進制指令。
這種用助記符編程的工具就是匯編語言。
1.1.2 低級語言和高級語言
后來又有人覺得匯編語言麻煩,因為匯編語言實際上就是對機器指令的一對一替換,雖然記憶指令方便了,但是在控制計算機硬件的時候還要事無具細的控制。
比如實現一個小小的功能,在顯示器上顯示文本,可能都需要數十行的代碼來編寫。
於是有人研究出了更高級的編程語言,如C語言,這種較高級的語言,把一些控制硬件瑣碎的操作進行的封裝,直接用很少的代碼就可以代替匯編或機器指令一段常用的代碼。
這樣用C語言編寫代碼更有易於從邏輯上去思考,而不是把精力浪費在對機器硬件繁鎖的操作上。
實際上最終想要在硬件上運行,還是要把C語言編寫的代碼替換成對應的機器指令來執行,不過這事就由編譯程序來做就可以了,程序員只負責寫C語言代碼即可。
C語言雖然是一大進步,告別了繁瑣的硬件操控,但是仍然包含了很多關於內存的操控,比如創建數據時,要申請內存空間,當不想使用數據時,要手動釋放內存空間。
當我們編寫程序的時候還要考慮內存的申請和釋放,這可能會影響我們編寫的思路。
所以在C語言的基礎上,出現一些更高級的編程語言,大部分是針對C語言進行的再封裝,把C語言中常用的功能代碼段,操作指令,還有C語言編程過程中需要考慮的一些細節封裝。
讓編寫程序的人只考慮程序的組織邏輯,盡量的少去思考硬件的相關的東西,這種語言就是高級語言。
常見的高級語言有C++,JAVA,PYTHON, GO...
python 就是一門高級語言,我們稱C語言為低級語言。
高級語言因為封裝了更多的東西,所以編寫程序的速度會很快,比如實現一個功能,用C語言需要用幾百行代碼來實現,用python可能只需要寫幾行代碼來實現。
但是最終想在計算機中運行,還是要翻譯成機器指令來執行。高級語言在翻譯的過程中,會產生更多的無用操作,沒有低級語言直接。所以高級語言的執行速度不如低級語言。
種類 | 代表語言 | 執行效率 | 開發效率 |
---|---|---|---|
低級語言 | C | 快 | 慢 |
高級語言 | Python | 慢 | 快 |
那么到底是執行效率重要還是開發效率重要呢?不同的應用場景下,選擇也不一樣。
比如操作系統,位於底層,一切軟件運行在操作系統之上,如果操作系統都不快,那運行在操作系統上的軟件也快不了,
另外操作系統本身的功能也是需要經常和硬件來打交道。所以開發操作系統,肯定首選C這種低級語言。
軟件公司,可能為了搶占市場,一個領域的商機發現之后,當然希望快速的開發出來,盡早面市,這種情況會選擇高級語言,因為相比於那一點點效率,產品的研發速度更重要。
實際上高級語言雖然慢,但是通常情況下大家是可以接受的,比如C語言運算一個功能需要0.001秒,python需要0.1秒,雖然速度差了一百倍,但是我們大部分情況下是感知不出來的。
1.1.3 Pyhon語言介紹
首先python 是一門高級語言。
python 還是是解釋型語言。
高級語言想要在計算機上運行,必須翻譯成機器能識別的指令,即機器碼來運行。
如何翻譯成機器指令,分為兩種
- 編譯型語言,直接把高級語言的代碼翻譯成機器可識別的指令然后保存下來,接下來每次運行,都直接運行翻譯后的機器代碼就可以了。
- 解釋型語言,需要有一個解釋器,運行時由解釋器一行一行的翻譯成機器代碼並運行。
python還是一門可移植的語言
可移植的語言可以理解為一套代碼可以在不同的平台,操作系統上運行。常的操作系統如windows, linux, mac osx, unix..
由於是解釋型語言,所以Python運行的環境只要有python解釋器就可以,不存在平台的限制。
python是一門面向對象的語言
面向對象是一種當下最流行的軟件開發方法和開發思想,把現實事物模擬成計算機代碼中的對象處理,現實事物可以有數據和行為,
就可以對應面象對象語言中的類的屬性和方法。面向對象的核心,封裝,繼承,多態,在python中都有非常好的支持。
python的解釋器根據開發的言不同,分為以下幾類
- CPython 使用C語言開發的解釋器,目前最流行,使用最廣的解釋器
- Jython 使用java語言開發的解釋器,可以很好的和java語言交互,可以把python直接編譯成對應的Java代碼
- Ironpython 使用C#開發的解釋器,可以很好的和微軟的.Net平台交互。
- Pypy 使用python語言子集開發的解釋器,采用JIT技術,做了大量的優化,解析速度是所有解釋器里最快的,比Cpython還要快很多倍
python語言本身是有版本的,因為Python本身也需要不斷的完善
一般情況下,小版本的變更沒有太大的影響。
不過Python有兩個大版本,即Python2和Python3
這是兩個不兼容的版本,因為python語言為了使自己變得更完善,內部做了大量的優化,導致Python3和Python2的一些內容不一樣,
最明顯的就是同樣的代碼在python3上可以運行,在python2上不能運行。
目前官方已經不再維護Python2的版本,這是一個已經被時代廢棄的版本。
目前所有的項目都在從Python2轉到python3,學python2已經沒有多少意義了。
不過Python2和python3對於編寫程序的人來說,影響並不是特別大,個別的一些用法不同,只需要稍微調整一下就可以了。
1.2 Python安裝及執行
1.2.1 安裝解釋器
想要編寫並運行Python代碼,第一步,就是安裝一個Python的解釋器。
我們可以去Python官網下載一個python3的解釋器
https://www.python.org/downloads/
挑選一個適合自己操作系統的解釋器安裝即可。
1.2.2 運行Python代碼
運行python代碼有兩種方法
第一種是把代碼寫到文件當中保存,調用解釋器解釋文件。
比如我們新建一個記事本,在其中寫上以下代碼
含義是在屏幕上顯示 “hello, python”
print("hello, python")
然后保存為 helllo.py文件
想讓解釋器解釋我們的代碼文件,就直接把文件的路徑告訴解釋器就可以了。
打開命令行,輸入python解釋器的路徑 + 源文件的路徑
第二種是直接打開解釋器,在解釋器中輸入一行代碼,解釋器就立即解釋執一行代碼
這種被稱為交互模式,主要是用來調試的, 在命令行中直接輸入python解釋器的路徑,就可以直接運行
其中,>>> 后面就可以輸入我們想要讓解釋器解釋的代碼
1.2.3 源文件的編碼
只要涉及到文本,就涉及到編碼
我們的python代碼文件也是由文字組成的,所以python代碼文件也隱含了一個編碼問題
在python3 當中,解釋器會默認認為我們的python文件是UTF-8格式的編碼
UTF8是通用的編碼格式,也是現在的主流。
但是如果我們不想讓解釋器以UTF8格式編碼解析,我們就可以在代碼文件第一行,加上下面的
這樣解釋器就會以gbk編碼來解析我們的代碼文件
# -*- coding: gbk -*-
如果在linux上,可能會加上一行解釋器的路徑 ,這時就需要把coding放在第二行
#!/usr/bin/env python3 # -*- coding: gbk -*-
1.2.4 環境變量
如果每次都在命令行里輸入這么長的python解釋器路徑,覺得很麻煩,那有一個方法,就是我們把Python解釋器的路徑告訴操作系統
之后我們運行解釋器就不用把完整的路徑也輸入出來了。
如何告訴操作系統呢,操作系統有一個環境變量叫path,我們把python的路徑加進去就可以了。
win10環境變量打開方式
這里給出win10環境變量的配置方法
https://jingyan.baidu.com/article/c33e3f483ab7d4ea14cbb548.html
把Python的安裝路徑配置進去之后,在命令行里直接輸入python,就代表運行python解釋器了。
1.2.5 PyCharm-最好的IDE
IDE就是集成開發環境,(Integrated Development Environment)就是一個我們用來幫助開發Python代碼的軟件
如果我們不用IDE,寫一個python代碼文件,要用記事本編寫,再保存,再用python解釋器去執行,有點麻煩,
使用了IDE后,可以快速的新建文件,編寫代碼,而且代碼出錯會有提示,
執行代碼,只需要鼠標點一下,或者快捷鍵按一下,就可以讓代碼運行起來,
其實用性還遠不止如此,總之一句話,IDE就是讓你舒服,一些麻煩事他來幫你做,你只需要關注寫代碼就行了。
目前開發python代碼最好的工具就是PyCharm。
PyCharm分為兩種版本
- 社區版:提供python開發的基礎功能,重要的是,免費
- 專業版:不但有基礎功能,還額外提供了WEB開發的功能,比如CSS,JS,HTML,SQL等,但是專業版收費
用哪個版本,這個看自己的實際需要,建議可以先用社區版學習Python,如果有需要,再考慮用各種方式獲得專業版軟件。
當然如果有條件,就直接安裝使用專業版。我只知道專業版是要收錢的,不花錢能不能用,我就不知道了。。。
pycharm 官網下載地址
https://www.jetbrains.com/pycharm/download/
Community就是社區版, Professional就是專業版
1.2.6 jupyter
python內置有很多別人實現好的功能,都放在倉庫里了,有的東西是在python語言里面的,
由python官方提供的,叫做標准庫可以直接拿來用,有些東西是一些技術特別厲害的人或組織提供的,叫做第三方庫
想用第三方庫,需要去網上下載,python所有的第三方庫會放在一些固定的網絡上,這些網絡叫源,
獲取第三方庫很簡單,只需要簡單使用pip命令就可以了,
比如我們這里想安裝一個jupyter
pip install jupyter
默認pip 去獲取的第三方庫的源是國外的網站,我們訪問起來速度不行
那我們可以通過配置,改變這個獲取第三方庫的源,
需要通過一些配置,來改變源
比較常用的國內源有:
(1)阿里雲 http://mirrors.aliyun.com/pypi/simple/ (2)豆瓣http://pypi.douban.com/simple/ (3)清華大學 https://pypi.tuna.tsinghua.edu.cn/simple/ (4)中國科學技術大學 http://pypi.mirrors.ustc.edu.cn/simple/ (5)華中科技大學http://pypi.hustunique.com/
如果只是想臨時修改
在使用pip的時候,加上參數-i和源地址
pip install -i http://mirrors.aliyun.com/pypi/simple/ jupyter
如果想每次使用pip源都使用修改后的,不用加-i參數
那就使用永久方法,把源地址配置一下
liux上修改源
創建或修改 ~/.pip/pip.conf
windows上修改源
創建或修改 c:\Users\用戶名\pip\pip.ini
[global] index-url = http://mirrors.aliyun.com/pypi/simple/ [install] trusted-host = http://mirrors.aliyun.com
安裝 jupyter后,在命令行里輸入命令運行
jupyter-notebook
1.3 變量及命名規則
1.3.1 什么是變量
變量是用來存儲可變數據的,我們在編寫程序的時候,想要記錄一些狀態,比如一個人的身高,體重,名字,性別,
這些數據在程序運行時需要存儲在內存中,記錄下來,當有變化時,又可以去修改他們的值。
我們把內存可以理解為一個一個的小房間,變量理解為房間的門牌號。
房間里存放的是各種數據,數據可以隨時變化,修改。
如 下面的代碼
name = "張三" age = 18
name和age是變量,他們可以自已定義用什么符號(門牌號),
"張三"和 18是數據,用來記錄張三的姓名和年齡狀態
這些數據是保存在內存當中的,計算機的內存中有兩個小房間中就存儲着張三和18這兩個值
1.3.2 變量命名規則
變量名(門牌號)可以自己起,但必須符合以下規則
必須以由字母或下划線(_)開頭,並由數字,字母,下划線組成
比如合法的變量名
name123
_age_2
A_B_C_3_4
不合法的變量名
9abcd
ag(^ $t5
另外,變量名不能和python的關鍵字一樣,否則會引起沖突
怎么知道python有哪些關鍵字呢?
在python解釋器里輸入下面兩行代碼
import keyword
print(keyword.kwlist)
變量名是區分大小寫的
比如 name 和Name就是兩個不同的變量名
DEL就不會和關鍵字del產生沖突
1.4 基本數據類型和運算符
數據存儲在內存當中,是有類型的
這里先介紹三種最基本的類型
1.4.1 數字
數字分為兩種,整數和浮點數
整數就數字,如,1314,8848,1234567890987654321
浮點數就是小數, 3.1415926, 0.001
1.4.2 字符串
字符串就是一段用引號包起來的字符,可以是單引號,雙引號,三個單引號,三個雙引號包起來
注意引號必須是英文中的引號,輸入法要切換到英文狀態下再輸入
如 '你好', "孔雀東南飛", """夜落烏啼霜滿天""", '''君不見黃河之水天上來''','Good Morning'
1.4.3 布爾
布爾只有兩個值 True和False,對應真和假
當某件事,某個判斷成立,就是True, 就是真的意思
反之就是False,是假的意思
1.4.4 運算符
運算符是用來運算數據的
先介紹兩類運算符
1.4.4.1 算術運算符
運算符 | 功能 | 例子 |
---|---|---|
+ | 加法運算 | >>>100 +200 300 |
- | 減法運算 | >>>300 - 100 200 |
* | 乘法運算 | >>>2 * 5 10 |
/ | 除法運算 | >>> 3/2 1.5 |
% | 取余運算 | >>>10 % 6 4 |
** | 乘方運算 | >>>2 ** 10 1024 |
// | 整除運算 | >>> 3//2 1 |
算術運算符主要是用於對數字類型做運算,與數學上的運算概念是一致的。
所以運算的數據類型必須都是數字類型,如果我們用兩個字符串做 除法,解釋器就會給我們報錯,
同樣給出了提示,不支持字符串和字符串之間做除法運算
>>> '姑蘇城外寒山寺' / '夜半鍾聲到客船'
Traceback (most recent call last):
File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for /: 'str' and 'str'
但是字符串和字符串之間是可以做加法運算的,其功能是,把兩個字符串拼成一個字符串
>>> '姑蘇城外寒山寺,' + '夜半鍾聲到客船' '姑蘇城外寒山寺,夜半鍾聲到客船'
另外,一個字符串可以用來乘以一個整數,其功能是,把字符串重復多少次
>>> '鵝,' * 3
'鵝,鵝,鵝,'
1.4.4.2 關系運算符
關系運算符是用來運算兩種數據類型的關系的,運算數據可能是多種類型,運算結果是布爾值
運算符 | 功能 | 例子 |
---|---|---|
== | 相等判斷 | >>>1 == 2 False |
!= | 不等判斷 | >>>'你好' != "你好" False |
> | 大於判斷 | >>>100 > 99 True |
>= | 大於等於 | >>> 100 >=100 True |
< | 小於判斷 | >>> 0.5 < 0.5 False |
<= | 小於等於 | >>> 1<= 2 True |
關系運算符還支持三種 連接運算, 中文含義叫與,或,非
and 並且(與運算), 兩個同時為真才為真
or 或運算,兩個有一個是真的,結果就為真
not 非, 把對應布爾值取反
比如
1 == 1 and 1 == 2 # False 1 != 1 and 1 != 2 # False 1 == 1 and 2 == 2 # True 1 == 1 or 1 == 2 # True 1 != 1 or 1 != 2 # True 1 != 1 or 2 != 2 # False not 1 == 1 # False not 1 != 1 # True
其它的運算結果為布爾值的還有 in, not in
is, is not
1.4.4.3 賦值運算符
賦值操作,是把數據和變量綁定起來,數據是存儲在內存中的,所以每一個數據在內存中會有一個地址,類似於門牌號
賦值操作,直接上是讓變量這種符號和數據內存中的地址(門牌號)建立起關系,以后訪問內存中的這塊數據,只需要使用變量名就要以拿到內存中的這塊數據
最常用的賦值就是用一個等號
num = 123 name = '道可道,非常道'
也可以這樣賦值,這種也叫序列賦值
x, y, z = 1, 2, 3
x, y = y, x
也可以鏈式賦值
x = y = z = 1
也可以增量賦值
x += 1 #等價於x = x + 1 下面的也都類似 y *= 2 x -= 1 y /= 2 x **= 2 y //= 2 x %= 2
1.5 程序設計
程序運行,分為三種基本的結構
- 順序結構,正常情況下,解釋器會自上而下一行一行的執行代碼
- 選擇結構,程序中出現分支,有選擇的執行代碼
- 循環結構,程序中重復執行一段代碼
實際上任何一段程序都是由這三種最基本的結構來組成的,他們之間可以互相混合使用
比如選擇結構中可以包括循環結構,循環結構中重復執行的內容可以是順序結構,也可以帶選擇結構,也可以再包括一個循環結構...
1.5.1 輸入和輸出
為了寫一些簡單的程序,我們先介紹兩個基本的函數, print 和 input
print函數是用來顯示數據,把數據在命令行上顯示 ,print函數可以顯示任何數據,顯示多個數據,用逗號隔開
>>> print('明月幾時有')
明月幾時有
>>> print(3) 3 >>> print(3+2) 5 >>> print(True, False, 1, '君問歸期未有期') True False 1 君問歸期未有期
input是用來輸入數據,讓我們可以在命令行上輸入數據,收集到輸入的數據后,傳遞給程序中的變量
input輸入的數據統一都是字符串的格式, input后面的括號里還可以加入輸入提示信息,用字符串來表示
1 >>> name = input("你好,請問你叫啥名?")
2 你好,請問你叫啥名? 3 帥比 4 >>> print(name) 5 帥比
第3行的名字是我們自己輸入的,輸入之后,把內容賦值給了變量name,第4行再打印出來
1.5.2 順序結構
順序結構就是自上而下的逐行執行,實際上學了以上的內容,我們就可以編寫順序結構的程序了
下面我們可以做兩個練習感受一下。
練習一, 表示溫度有兩種單位,華氏度和攝氏度, 我們常用的是攝氏度,攝氏度轉換成華氏度的公式, 華氏度=1.8 * 攝氏度 + 32
設計一個程序,用戶輸入攝氏度,輸出對應的華氏度,

注意
- 代碼中#號后面的內容 是注釋,解釋器會直接跳過這一行,解釋下一行的代碼
- input輸入的是字符串,不能參與數算術運算,需要用float把字符串轉換成小數,如果想轉換成整數用int
練習二,用戶輸入數字,判斷用戶輸入的是否是奇數,如果是奇數,顯示True, 不是,顯示False

1.5.3 選擇結構
選擇結構,是指程序有選擇的執行,靠什么來選擇呢,就是我們前面學到的布爾類型,True 和False
選擇結構的一般句式是
if exp:
do something
elif exp: do something else: do something
解釋器讀到if 開始進行判斷
exp是一個表達式,什么是表達式呢,表達式就是一段運算,包括數據類型和運算符,也可以是一個函數,只要運算之后會生成一個值。
什么是值呢,值就是可以被賦值給變量的數據。
exp的值換算成布爾值,如果是真,就執行在if exp下面的一段縮進的代碼段
exp的值換算成布爾值,如果是假,就跳到elif exp 繼續判斷。elif 可以有多個,也可以一個也沒有
.
.
.
如果所有的elif 后面的exp換算成布爾值都是假,就執行else下面縮進的代碼段
其中只有if 語句是必須的,其它elif和else語句都是可選的,就是說可以不使用。
每一個分支下面的代碼段,可以是任意的python語句,當然也包括if語句,所以if語句是可以嵌套的
選擇語句程序基本執行流程
理解條件語句,我們可以做幾個練習
練習一 輸入成績,如果60分以下,輸出不合格,60~85分輸出良好,85~100分輸出優秀
score = input("請輸入成績:") score = float(score) if score < 60: print("不合格!") elif score < 85: print("良好!") elif score <= 100: print("優秀!") else: print("成績異常!")
練習二 輸入用戶名和密碼,如果用戶名為 zhangsan, 密碼為 123456, 輸出登陸成功,否則輸出 登陸失敗

username = input("請輸入用戶名:") password = input("請輸入密碼:") if username == 'zhangsan': if password == '123456': print('登陸成功') else: print('登陸失敗') else: print('登陸失敗')
上面這段代碼不是最優解,只是為了演示選擇語句的用法
1.5.4 循環結構
循環結構是用來重復執行一段代碼的,如何判斷是否重復和結束重復呢,還是用一個結果為布爾值的表達式來判斷
循環結構的基本句式是
while exp: do something else: do something
先判斷exp表達式的結果是否為真,如果為真,執行一次下面縮進的代碼塊,
然后再回到exp表達式進行計算,如果結果為真,就再執行一次下面縮進的代碼塊,
直到某一次exp表達式計算結果不為真,如果有else分支,就先執行else分支下面的語句,再執行while語句后面的代碼
如果沒有else分支,就直接 while語句后面的代碼
循環中的else語句同樣是可有可無的
另外,循環語句的縮進代碼塊中,可以使用break語句,直接跳出循環,甚至不進行判斷,不執行else分支,直接執行while語句后面的代碼
while True: print("執行break語句") break else: print("break 后不會執行這里") print("break后會直接跳到這里來執行")
循環語句的縮進代碼塊中,可也以使用continue語句,直接跳過continue后面的語句,進行exp表達式的判斷
num = 1 while num < 100: num = num + 1 # 判斷是否能被2整除,如果是偶數,就直接跳下一次循環 if num % 2 == 0: continue print("如果", num, "是偶數", "就不會執行到這里")
做幾個練習加深一下理解
練習一 輸出1~100以內所有整數的和
sum = 0 i = 1 while i <= 100: sum = sum + i i = i + 1 print(sum)
練習二 輸出1~100之間的奇數
i = 1 while i<=100: if i % 2 != 0 : print(i) i = i + 1
練習三 輸出1~100 之間所有偶數的和
sum = 0 i = 1 while i <=100: if i%2== 0: sum += i # sum = sum + i i += 1 print(sum)
練習四 輸出1-2+3-4+5.. 100的和

i = 1 sum = 0 while i <= 100: if i % 2 == 1: sum = sum + i else: sum = sum - i i += 1 print(sum)
練習五 輸入用戶名密碼,假設用戶名為zhangsan 密碼為123456,如果用戶名密碼匹配,輸出成功,
如果密碼輸入錯了,提示重新輸入,連續輸錯三次用戶名和密碼就退出登陸,提示登陸失敗

count = 1 while True: username = input("請輸入用戶名:") passowrd = input("請輸入密碼:") if username == 'zhangsan' and passowrd == '123456': print("登陸成功!") break elif count == 3: print("登陸失敗!") break else: print("用戶名或密碼錯誤,請重新輸入") count = count + 1
練習六 求斐波那契數列中小於1000的數, 斐波那契數列定義, 第一個數是0,第二個數是1,從第三位開始,每一個數字是前兩個數字的和
如0,1,1,2,3,5,8 ...

a, b = 0, 1 while a < 1000: print(a, end=',') a, b = b, a+b
1.5.5 空語句
當我們想在一個代碼塊中什么都不執行時,可以用pass來代替,pass表示一個空語句 ,什么都不執行
if score == 60: pass else: print("不及格")