本節內容
1.Python介紹
2.了解IDLE窗口
3.函數+模塊=標准庫
4.anaconda介紹
5.變量、賦值、數據
6.項目1
7.循環嵌套 練習if elif P18
8.for 循環 內置函數range()
9.random模塊
10.項目及練習
一 python介紹
python的創始人為吉多·范羅蘇姆(Guido van Rossum)。1989年的聖誕節期間,吉多·范羅蘇姆為了在阿姆斯特丹打發時間,決心開發一個新的腳本解釋程序,作為ABC語言的一種繼承。
最新的TIOBE排行榜,Python趕超C++占據第3, Python崇尚優美、清晰、簡單,是一個優秀並廣泛使用的語言。
編程語言主要從以下幾個角度為進行分類,編譯型和解釋型、靜態語言和動態語言、強類型定義語言和弱類型定義語言,每個分類代表什么意思呢,我們一起來看一下。
編譯和解釋的區別是什么?
編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進制文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快;
而解釋器則是只在執行程序時,才一條一條的解釋成機器語言給計算機來執行,所以運行速度是不如編譯后的程序運行的快的.
這是因為計算機不能直接認識並執行我們寫的語句,它只能認識機器語言(是二進制的形式)
一、低級語言與高級語言
最初的計算機程序都是用0和1的序列表示的,程序員直接使用的是機器指令,無需翻譯,從紙帶打孔輸入即可執行得到結果。后來為了方便記憶,就將用0、1序列表示的機器指令都用符號助記,這些與機器指令一一對應的助記符就成了匯編指令,從而誕生了匯編語言。無論是機器指令還是匯編指令都是面向機器的,統稱為低級語言。因為是針對特定機器的機器指令的助記符,所以匯編語言是無法獨立於機器(特定的CPU體系結構)的。但匯編語言也是要經過翻譯成機器指令才能執行的,所以也有將運行在一種機器上的匯編語言翻譯成運行在另一種機器上的機器指令的方法,那就是交叉匯編技術。
高級語言是從人類的邏輯思維角度出發的計算機語言,抽象程度大大提高,需要經過編譯成特定機器上的目標代碼才能執行,一條高級語言的語句往往需要若干條機器指令來完成。高級語言獨立於機器的特性是靠編譯器為不同機器生成不同的目標代碼(或機器指令)來實現的。那具體的說,要將高級語言編譯到什么程度呢,這又跟編譯的技術有關了,既可以編譯成直接可執行的目標代碼,也可以編譯成一種中間表示,然后拿到不同的機器和系統上去執行,這種情況通常又需要支撐環境,比如解釋器或虛擬機的支持,Java程序編譯成bytecode,再由不同平台上的虛擬機執行就是很好的例子。所以,說高級語言不依賴於機器,是指在不同的機器或平台上高級語言的程序本身不變,而通過編譯器編譯得到的目標代碼去適應不同的機器。從這個意義上來說,通過交叉匯編,一些匯編程序也可以獲得不同機器之間的可移植性,但這種途徑獲得的移植性遠遠不如高級語言來的方便和實用性大。
二、編譯與解釋
編譯是將源程序翻譯成可執行的目標代碼,翻譯與執行是分開的;而解釋是對源程序的翻譯與執行一次性完成,不生成可存儲的目標代碼。這只是表象,二者背后的最大區別是:對解釋執行而言,程序運行時的控制權在解釋器而不在用戶程序;對編譯執行而言,運行時的控制權在用戶程序。
解釋具有良好的動態特性和可移植性,比如在解釋執行時可以動態改變變量的類型、對程序進行修改以及在程序中插入良好的調試診斷信息等,而將解釋器移植到不同的系統上,則程序不用改動就可以在移植了解釋器的系統上運行。同時解釋器也有很大的缺點,比如執行效率低,占用空間大,因為不僅要給用戶程序分配空間,解釋器本身也占用了寶貴的系統資源。
編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進制文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快;
而解釋器則是只在執行程序時,才一條一條的解釋成機器語言給計算機來執行,所以運行速度是不如編譯后的程序運行的快的.
編譯型和解釋型
我們先看看編譯型,其實它和匯編語言是一樣的:也是有一個負責翻譯的程序來對我們的源代碼進行轉換,生成相對應的可執行代碼。這個過程說得專業一點,就稱為編譯(Compile),而負責編譯的程序自然就稱為編譯器(Compiler)。如果我們寫的程序代碼都包含在一個源文件中,那么通常編譯之后就會直接生成一個可執行文件,我們就可以直接運行了。但對於一個比較復雜的項目,為了方便管理,我們通常把代碼分散在各個源文件中,作為不同的模塊來組織。這時編譯各個文件時就會生成目標文件(Object file)而不是前面說的可執行文件。一般一個源文件的編譯都會對應一個目標文件。這些目標文件里的內容基本上已經是可執行代碼了,但由於只是整個項目的一部分,所以我們還不能直接運行。待所有的源文件的編譯都大功告成,我們就可以最后把這些半成品的目標文件“打包”成一個可執行文件了,這個工作由另一個程序負責完成,由於此過程好像是把包含可執行代碼的目標文件連接裝配起來,所以又稱為鏈接(Link),而負責鏈接的程序就叫……就叫鏈接程序(Linker)。鏈接程序除了鏈接目標文件外,可能還有各種資源,像圖標文件啊、聲音文件啊什么的,還要負責去除目標文件之間的冗余重復代碼,等等,所以……也是挺累的。鏈接完成之后,一般就可以得到我們想要的可執行文件了。
上面我們大概地介紹了編譯型語言的特點,現在再看看解釋型。噢,從字面上看,“編譯”和“解釋”的確都有“翻譯”的意思,它們的區別則在於翻譯的時機安排不大一樣。打個比方:假如你打算閱讀一本外文書,而你不知道這門外語,那么你可以找一名翻譯,給他足夠的時間讓他從頭到尾把整本書翻譯好,然后把書的母語版交給你閱讀;或者,你也立刻讓這名翻譯輔助你閱讀,讓他一句一句給你翻譯,如果你想往回看某個章節,他也得重新給你翻譯。
兩種方式,前者就相當於我們剛才所說的編譯型:一次把所有的代碼轉換成機器語言,然后寫成可執行文件;而后者就相當於我們要說的解釋型:在程序運行的前一刻,還只有源程序而沒有可執行程序;而程序每執行到源程序的某一條指令,則會有一個稱之為解釋程序的外殼程序將源代碼轉換成二進制代碼以供執行,總言之,就是不斷地解釋、執行、解釋、執行……所以,解釋型程序是離不開解釋程序的。像早期的BASIC就是一門經典的解釋型語言,要執行BASIC程序,就得進入BASIC環境,然后才能加載程序源文件、運行。解釋型程序中,由於程序總是以源代碼的形式出現,因此只要有相應的解釋器,移植幾乎不成問題。編譯型程序雖然源代碼也可以移植,但前提是必須針對不同的系統分別進行編譯,對於復雜的工程來說,的確是一件不小的時間消耗,況且很可能一些細節的地方還是要修改源代碼。而且,解釋型程序省卻了編譯的步驟,修改調試也非常方便,編輯完畢之后即可立即運行,不必像編譯型程序一樣每次進行小小改動都要耐心等待漫長的Compiling…Linking…這樣的編譯鏈接過程。不過凡事有利有弊,由於解釋型程序是將編譯的過程放到執行過程中,這就決定了解釋型程序注定要比編譯型慢上一大截,像幾百倍的速度差距也是不足為奇的。
編譯型與解釋型,兩者各有利弊。前者由於程序執行速度快,同等條件下對系統要求較低,因此像開發操作系統、大型應用程序、數據庫系統等時都采用它,像C/C++、Pascal/Object Pascal(Delphi)、VB等基本都可視為編譯語言,而一些網頁腳本、服務器腳本及輔助開發接口這樣的對速度要求不高、對不同系統平台間的兼容性有一定要求的程序則通常使用解釋性語言,如Java、JavaScript、VBScript、Perl、Python等等。
但既然編譯型與解釋型各有優缺點又相互對立,所以一批新興的語言都有把兩者折衷起來的趨勢,例如Java語言雖然比較接近解釋型語言的特征,但在執行之前已經預先進行一次預編譯,生成的代碼是介於機器碼和Java源代碼之間的中介代碼,運行的時候則由JVM(Java的虛擬機平台,可視為解釋器)解釋執行。它既保留了源代碼的高抽象、可移植的特點,又已經完成了對源代碼的大部分預編譯工作,所以執行起來比“純解釋型”程序要快許多。而像VB6(或者以前版本)、C#這樣的語言,雖然表面上看生成的是.exe可執行程序文件,但VB6編譯之后實際生成的也是一種中介碼,只不過編譯器在前面安插了一段自動調用某個外部解釋器的代碼(該解釋程序獨立於用戶編寫的程序,存放於系統的某個DLL文件中,所有以VB6編譯生成的可執行程序都要用到它),以解釋執行實際的程序體。C#(以及其它.net的語言編譯器)則是生成.net目標代碼,實際執行時則由.net解釋系統(就像JVM一樣,也是一個虛擬機平台)進行執行。當然.net目標代碼已經相當“低級”,比較接近機器語言了,所以仍將其視為編譯語言,而且其可移植程度也沒有Java號稱的這么強大,Java號稱是“一次編譯,到處執行”,而.net則是“一次編碼,到處編譯”。呵呵,當然這些都是題外話了。總之,隨着設計技術與硬件的不斷發展,編譯型與解釋型兩種方式的界限正在不斷變得模糊。
動態語言和靜態語言
通常我們所說的動態語言、靜態語言是指動態類型語言和靜態類型語言。
(1)動態類型語言:動態類型語言是指在運行期間才去做數據類型檢查的語言,也就是說,在用動態類型的語言編程時,永遠也不用給任何變量指定數據類型,該語言會在你第一次賦值給變量時,在內部將數據類型記錄下來。Python和Ruby就是一種典型的動態類型語言,其他的各種腳本語言如VBScript也多少屬於動態類型語言。
(2)靜態類型語言:靜態類型語言與動態類型語言剛好相反,它的數據類型是在編譯其間檢查的,也就是說在寫程序時要聲明所有變量的數據類型,C/C++是靜態類型語言的典型代表,其他的靜態類型語言還有C#、JAVA等。
強類型定義語言和弱類型定義語言
(1)強類型定義語言:強制數據類型定義的語言。也就是說,一旦一個變量被指定了某個數據類型,如果不經過強制轉換,那么它就永遠是這個數據類型了。舉個例子:如果你定義了一個整型變量a,那么程序根本不可能將a當作字符串類型處理。強類型定義語言是類型安全的語言。
(2)弱類型定義語言:數據類型可以被忽略的語言。它與強類型定義語言相反, 一個變量可以賦不同數據類型的值。
強類型定義語言在速度上可能略遜色於弱類型定義語言,但是強類型定義語言帶來的嚴謹性能夠有效的避免許多錯誤。另外,“這門語言是不是動態語言”與“這門語言是否類型安全”之間是完全沒有聯系的!
例如:Python是動態語言,是強類型定義語言(類型安全的語言); VBScript是動態語言,是弱類型定義語言(類型不安全的語言); JAVA是靜態語言,是強類型定義語言(類型安全的語言)。
通過上面這些介紹,我們可以得出,python是一門動態解釋性的強類型定義語言。
三、python的優缺點
先看優點
- Python的定位是“優雅”、“明確”、“簡單”,所以Python程序看上去總是簡單易懂,初學者學Python,不但入門容易,而且將來深入下去,可以編寫那些非常非常復雜的程序。
- 開發效率非常高,Python有非常強大的第三方庫,基本上你想通過計算機實現任何功能,Python官方庫里都有相應的模塊進行支持,直接下載調用后,在基礎庫的基礎上再進行開發,大大降低開發周期,避免重復造輪子。
- 高級語言————當你用Python語言編寫程序的時候,你無需考慮諸如如何管理你的程序使用的內存一類的底層細節
- 可移植性————由於它的開源本質,Python已經被移植在許多平台上(經過改動使它能夠工 作在不同平台上)。如果你小心地避免使用依賴於系統的特性,那么你的所有Python程序無需修改就幾乎可以在市場上所有的系統平台上運行
- 可擴展性————如果你需要你的一段關鍵代碼運行得更快或者希望某些算法不公開,你可以把你的部分程序用C或C++編寫,然后在你的Python程序中使用它們。
- 可嵌入性————你可以把Python嵌入你的C/C++程序,從而向你的程序用戶提供腳本功能。
python

1 print("hello world")
c++

1 #include <iostream> 2 int main(void) 3 { 4 std::cout<<"Hello world"; 5 }
c

1 #include <stdio.h> 2 int main(void) 3 { 4 printf("\nhello world!"); 5 return 0; 6 }
java

1 public class HelloWorld{ 2 // 程序的入口 3 public static void main(String args[]){ 4 // 向控制台輸出信息 5 System.out.println("Hello World!"); 6 } 7 }
php

1 <?php 2 echo "hello world!"; 3 ?>
ruby

puts "Hello world."
再看缺點:
- 速度慢,Python 的運行速度相比C語言確實慢很多,跟JAVA相比也要慢一些,因此這也是很多所謂的大牛不屑於使用Python的主要原因,但其實這里所指的運行速度慢在大多數情況下用戶是無法直接感知到的,必須借助測試工具才能體現出來,比如你用C運一個程序花了0.01s,用Python是0.1s,這樣C語言直接比Python快了10倍,算是非常誇張了,但是你是無法直接通過肉眼感知的,因為一個正常人所能感知的時間最小單位是0.15-0.4s左右,哈哈。其實在大多數情況下Python已經完全可以滿足你對程序速度的要求,除非你要寫對速度要求極高的搜索引擎等,這種情況下,當然還是建議你用C去實現的。
- 代碼不能加密,因為PYTHON是解釋性語言,它的源碼都是以名文形式存放的,不過我不認為這算是一個缺點,如果你的項目要求源代碼必須是加密的,那你一開始就不應該用Python來去實現。
- 線程不能利用多CPU問題,這是Python被人詬病最多的一個缺點,GIL即全局解釋器鎖(Global Interpreter Lock),是計算機程序設計語言解釋器用於同步線程的工具,使得任何時刻僅有一個線程在執行,Python的線程是操作系統的原生線程。在Linux上為pthread,在Windows上為Win thread,完全由操作系統調度線程的執行。一個python解釋器進程內有一條主線程,以及多條用戶程序的執行線程。即使在多核CPU平台上,由於GIL的存在,所以禁止多線程的並行執行。關於這個問題的折衷解決方法,我們在以后線程和進程章節里再進行詳細探討。
二 了解IDLE窗口
回顧解釋型。什么是IDE?Python還有哪些IDE?
三 函數+模塊=標准庫
1、 python模塊類型
a.標准庫
b.開源模塊(github等)
c.自定義模塊
2、觀察標准庫
1 import sys 2 sys.platform
1 print(sys.version)
1 import os 2 os.getcwd()
1 os.environ
1 import datetime 2 datetime.date.today()
1 import datetime 2 datetime.date.today().day 3 datetime.date.today().month 4 datetime.date.today().year
1 datetime.date.isoformat(datetime.date.today())
1 import time 2 time.strftime("%H:%M")

#%y 兩位數的年份表示(00-99) #%Y 四位數的年份表示(000-9999) #%m 月份(01-12) #%d 月內中的一天(0-31) #%H 24小時制小時數(0-23) #%I 12小時制小時數(01-12) #%M 分鍾數(00=59) #%S 秒(00-59) #%a 本地簡化星期名稱 #%A 本地完整星期名稱 #%b 本地簡化的月份名稱 #%B 本地完整的月份名稱 #%c 本地相應的日期表示和時間表示 #%j 年內的一天(001-366) #%p 本地A.M.或P.M.的等價符 #%U 一年中的星期數(00-53)星期天為星期的開始 #%w 星期(0-6),星期天為星期的開始 #%W 一年中的星期數(00-53)星期一為星期的開始 #%x 本地相應的日期表示 #%X 本地相應的時間表示 #%Z 當前時區的名稱 #%% %號本身
1 import html 2 html.escape("This HTML fragment contains a <script>script</script> tag.") 3 html.unescape("I ♥ Python's <standard library>.")
問:怎么知道標准庫的某個特定的模塊做什么?
答:Python文檔給出了標准庫的所有答案:https://docs.python.org/3/library/index.html
標准庫
1.時間模塊:time與datetime
在Python中,通常有這幾種方式來表示時間:
1)時間戳 指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)到現在等秒數(UNIX誕生元年)。
1 import time 2 time.time()
2)格式化的時間字符串
按照自己等格式定義的字符串例如:(2019-08-25 08:30:56)等
3)元組(struct_time)共九個元素。由於Python的time模塊實現主要調用C庫,所以各個平台可能有所不同。
UTC(Coordinated Universal Time,世界協調時)亦即格林威治天文時間,世界標准時間。在中國為UTC+8。DST(Daylight Saving Time)即夏令時。
*help的使用
1 import time 2 help(time)
1 import time 2 time.localtime()
1 import time 2 time.sleep(2)
1 import time 2 #轉換成UTC 3 help(time.gmtime) 4 time.gmtime()
四 anaconda介紹(python的正確姿勢)
python的一般安裝方法:
windows:
1、 https://www.python.org/downloads/ 選擇適合自己電腦的最新版本 (30M)
2、配置環境變量
【右鍵計算機】
-
-
》【屬性】
-
-
》【高級系統設置】
-
-
》【高級】
-
-
》【環境變量】
-
-
》【在第二個內容框中找到 變量名為Path 的一行,雙擊】
-
-
> 【Python安裝目錄追加到變值值中,用 ; 分割】
如:原來的值;C:\python37,切記前面有分號
管理工具為:pip 例:
1 pip install request
anaconda介紹及安裝:
Anaconda 是Python的一個開源發行版本,主要面向科學計算(數據分析、數據挖掘等)。(500-700M)
預裝了非常多標准庫,例如numpy(矩陣計算)、PIL(圖像處理)、pandas(數據分析)等。
anaconda安裝:
1、https://www.anaconda.com/distribution/
2、選擇自動配置環境變量,不需要手動配置。
3、手動配置:(默認C:\ProgramData)
C:\ProgramData\Anaconda3;
C:\ProgramData\Anaconda3\Library\mingw-w64\bin;
C:\ProgramData\Anaconda3\Library\usr\bin;
C:\ProgramData\Anaconda3\Library\bin;
C:\ProgramData\Anaconda3\Scripts;
管理工具:conda
1 conda install pandas
五 變量、賦值、數據
變量用於存儲要在計算機程序中引用和操作的信息。它們還提供了一種用描述性名稱標記數據的方法,以便讀者和我們自己能夠更清楚地理解我們的程序。將變量看作包含信息的容器是有幫助的。它們的唯一目的是在內存中標記和存儲數據。然后可以在整個程序中使用這些數據。
聲明變量
1 #_*_coding:utf-8_*_ 2 3 name ="Zhichao Xu"
上述代碼聲明了一個變量,變量名為: name,變量name的值為:"Zhichao Xu"
變量定義的規則:
- 變量名只能是 字母、數字或下划線的任意組合
- 變量名的第一個字符不能是數字
- 以下關鍵字不能聲明為變量名
['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda','not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
變量的命名(補充):
正確的姿勢:

1 wait_time = 26 2 gf_of_liu = "Lucy" #_類型,比較常用的類型 3 GFOfLiu = "Lucy" #首字母大寫
錯誤的一些例子:

1 2age = 18 2 and = "true" 3 $name ="James" 4 gender is = "male"
變量的賦值:
1 name = "Zhichao" 2 3 name2 = name 4 print(name,name2) 5 6 name = "Han-Teng" 7 8 print("What is the value of name2 now?")
六 項目1

1 from datetime import datetime 2 3 odds = [ 1, 3, 5, 7, 9, 11,13,15,17,19 4 21,23,25,27,29,31,33,35,37,39 5 41,43,45,47,49,51,53,55,57,59] 6 7 right_this_minute = datetime.today().minute 8 9 if right_this_minute in odds: 10 print("This minute seems a little odd.") 11 else: 12 print("Not an odd minute.")
注:if語句
if 條件:
if-語句塊
if 條件:
if-語句塊
else:
else-語句塊
if 條件:
if-語句塊
elif 條件:
elif-語句塊
...
else:
else-語句塊
可以進行嵌套。 不要超過3層, 最多5層
七 循環嵌套 練習if elif P18

1 if today == "Saturday": 2 print("Party!") 3 elif today == "Sunday": 4 if condition == "Headache": 5 print("Recover, then rest.") 6 else: 7 print("Rest.") 8 else: 9 print("Work, work, work.")
八 for 循環 內置函數range()
用例1 循環迭代數字變量
1 for i in [1,2,3]: 2 print(i)
用例2 循環迭代字符串變量
1 for ch in "Hi!": 2 print(ch)
用例3 迭代指定的次數
1 for num in range(5): 2 print('Head First Rocks!')
range 實驗:

1 range(5) 2 3 list(range(5)) 4 5 list(range(5,10)) 6 7 list(range(0,10,2)) 8 9 list(range(10,0,-2)) 10 11 list(range(10,0,2)) 12 13 list(range(99,0,-1))
九 random模塊
1 import random 2 print(random.random()) 3 #random.random()用於生成一個0到1的隨機符點數: 0 <= n < 1.0
1 print (random.randint(1,7)) 2 #random.randint()的函數原型為:random.randint(a, b),用於生成一個指定范圍內的整數。 3 # 其中參數a是下限,參數b是上限,生成的隨機數n: a <= n <= b
大腦 P35測試 (改):

1 from datetime import datetime 2 3 import random 4 import time 5 6 odds = [1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59] 7 8 for i in range(5): 9 right_this_second = datetime.today().second 10 if right_this_second in odds: 11 print("This second seems a little odd.") 12 else: 13 print("Not an odd second.") 14 wait_time = random.randint(1,5) 15 time.sleep(wait_time)
十 練習
題目1:暫停一秒輸出
題目2:輸入某年某月某日,判斷該日是這一年的第幾天?
題目3:暫停一秒輸出,並格式化當前的時間
附加題:1、有四個數字:1、2、3、4,能組成多少個互不相同且無重復數字的三位數?各是多少?
2、嘗試輸出9*9乘法表