1. 程式人生 > 實用技巧 >python學習之路--Python入門

python學習之路--Python入門

目錄

  • 一、程式設計與程式語言
  • 二、程式語言分類
  • 三、主流程式語言介紹
  • 四、Python介紹
  • 五、安裝Python直譯器
  • 六、第一個Python程式
  • 七、變數
  • 八、使用者與程式互動
  • 九、基本資料型別
  • 十、格式化輸出
  • 十一、基本運算子
  • 十二、流程控制之if...else
  • 十三、流程控制之while迴圈
  • 十四、流程控制之for迴圈
  • 十五、開發工具IDE
  • 十六、擴充套件閱讀
  • 十七、作業

一 程式設計與程式語言

程式設計的目的:
計算機的發明,是為了用機器取代/解放人力,而程式設計的目的則是將人類的思想流程按照某種能給被計算機識別的表達方式傳遞狗日計算機,從而達到讓計算機能夠像人腦/電腦一樣自動執行的效果
什麼是程式語言
能夠被計算機識別的表達方式即程式語言,語言是溝通的介質,而程式語言是程式設計師與計算機溝通的介質。在程式設計的世界裡,計算機更像是人的奴隸,人類程式設計的目的就命令奴隸去工作。
什麼是程式設計?
程式設計即程式設計師根據需要把自己的思想流程按照某種程式語言的語法風格編寫下來,產出的結果就是包含一堆字元的檔案。

強調:程式在未執行前跟普通檔案無異,只有程式在執行時,檔案內所寫的字元才有特定的語法意義。

二 程式語言分類

程式語言的發展經歷

#機器語言:站在計算機角度,說計算機能聽懂的語言,就是直接用二進位制程式設計,直接操作硬體;
優點:最底層,執行速度最快;
缺點:最複雜,開發效率最低
#組合語言:站在計算機的角度,簡寫的英文識別符號取代二進位制去編寫程式,本質仍然是直接操作硬體; 優點:比較底層,執行速度快;
缺點:複雜,開發效率低

#高階語言:站在人的角度說人話,即用人類的字元去編寫程式,遮蔽了硬體操作
編譯型:執行速度快,不依賴語言環境執行,跨平臺差;
解釋型:跨平臺好,一份程式碼,到處使用,缺點是執行速度慢,依賴直譯器執行;


編譯類:編譯是指在應用源程式執行之前,就將程式原始碼“翻譯”成目的碼(機器語言),因此其目標程式可以脫離其語言環境獨立執行(編譯後生成的可執行檔案,是cpu可以理解的2進位制的機器碼組成的),使用比較方便、效率較高。
但應用程式一旦需要修改,必須先修改原始碼,再重新編譯生成新的目標檔案(* .obj,也就是OBJ檔案)才能執行,只有目標檔案而沒有原始碼,修改很不方便。
編譯後程序執行時不需要重新翻譯,直接使用編譯的結果就行了。程式執行效率高,依賴編譯器,跨平臺性差些。如C、C++、Delphi等

解釋類:執行方式類似於我們日常生活中的“同聲翻譯”,應用程式原始碼一邊由相應語言的直譯器“翻譯”成目的碼(機器語言),一邊執行,因此效率比較低,而且不能生成可獨立執行的可執行檔案,應用程式不能脫離其直譯器(想執行,必須先裝上直譯器,就像跟老外說話,必須有翻譯在場),但這種方式比較靈活,可以動態地調整、修改應用程式。如Python、Java、PHP、Ruby等語言。




高階語言更貼近人類語言,因而造成了:它必須被翻譯成計算機能讀懂二進位制後,才能被執行,按照翻譯方式分為:

#1. 編譯型(需要編譯器,相當於用谷歌翻譯):如C,執行速度快,除錯麻煩

#2.解釋型(需要直譯器,相當於同聲傳譯):如Python,執行速度慢,除錯方便

三、主流程式語言介紹

#C語言
C語言是一種計算機程式設計語言,它既具有高階語言的特點,又具有組合語言的特點。它由美國貝爾研究所設計,它可以作為工作系統設計語言,編寫系統應用程式,也可以作為應用程式設計語言,編寫不依賴計算機硬體的應用程式。它的應用範圍廣泛,具備很強的資料處理能力,不僅僅是在軟體開發上,而且各類科研都需要用到C語言,適於編寫系統軟體,三維,二維圖形和動畫,具體應用比如微控制器以及嵌入式系統開發。

#C++:
C++是C語言的繼承的擴充套件,它既可以進行C語言的過程化程式設計,又可以進行以抽象資料型別為特點的基於物件的程式設計,還可以進行以繼承和多型為特點的面向物件的程式設計。C++擅長面向物件程式設計的同時,還可以進行基於過程的程式設計,因而C++就適應的問題規模而論,大小由之。
C++不僅擁有計算機高效執行的實用性特徵,同時還致力於提高大規模程式的程式設計質量與程式設計語言的問題描述能力。

#JAVA:
Java是一種可以撰寫跨平臺應用軟體的面向物件的程式設計語言,是由Sun Microsystems公司於1995年5月推出的Java程式設計語言和Java平臺(即JavaSE, JavaEE, JavaME)的總稱。Java 技術具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應用於個人PC、資料中心、遊戲控制檯、科學超級計算機、行動電話和網際網路,同時擁有全球最大的開發者專業社群。在全球雲端計算和移動網際網路的產業環境下,Java更具備了顯著優勢和廣闊前景。

#PHP:
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文字前處理器”)是一種通用開源指令碼語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域
Ruby:
Ruby 是開源的,在Web 上免費提供,但需要一個許可證。[4]
Ruby 是一種通用的、解釋的程式語言。
Ruby 是一種真正的面向物件程式語言。
Ruby 是一種類似於 Python 和 Perl 的伺服器端指令碼語言。
Ruby 可以用來編寫通用閘道器介面(CGI)指令碼。
Ruby 可以被嵌入到超文字標記語言(HTML)。
Ruby 語法簡單,這使得新的開發人員能夠快速輕鬆地學習 Ruby

#GO:
Go 是一個開源的程式語言,它能讓構造簡單、可靠且高效的軟體變得容易。
Go是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持開發,後來還加入了Ian Lance Taylor, Russ Cox等人,並最終於2009年11月開源,在2012年早些時候釋出了Go 1穩定版本。現在Go的開發已經是完全開放的,並且擁有一個活躍的社群。
由其擅長併發程式設計

#Python:
Python是一門優秀的綜合語言, Python的宗旨是簡明、優雅、強大,在人工智慧、雲端計算、金融分析、大資料開發、WEB開發、自動化運維、測試等方向應用廣泛,已是全球第4大最流行的語言。
幾個主流的程式語言介紹

四、Python介紹

Python可以應用於眾多領域,如:資料分析、元件整合、網路服務、影象處理、數值計算和科學計算等眾多領域。目前業內幾乎所有大中型網際網路企業都在使用Python,如:Youtube、Dropbox、BT、Quora(中國知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、騰訊、汽車之家、美團等。

Python的應用領域

#1. WEB開發——最火的Python web框架Django, 支援非同步高併發的Tornado框架,短小精悍的flask,bottle, Django官方的標語把Django定義為the framework for perfectionist with deadlines(大意是一個為完全主義者開發的高效率web框架)
#2. 網路程式設計——支援高併發的Twisted網路框架, py3引入的asyncio使非同步程式設計變的非常簡單
#3. 爬蟲——爬蟲領域,Python幾乎是霸主地位,Scrapy\Request\BeautifuSoap\urllib等,想爬啥就爬啥
#4. 雲端計算——目前最火最知名的雲端計算框架就是OpenStack,Python現在的火,很大一部分就是因為雲端計算
#5. 人工智慧——誰會成為AI 和大資料時代的第一開發語言?這本已是一個不需要爭論的問題。如果說三年前,Matlab、Scala、R、Java 和 Python還各有機會,局面尚且不清楚,那麼三年之後,趨勢已經非常明確了,特別是前兩天 Facebook 開源了 PyTorch 之後,Python 作為 AI 時代頭牌語言的位置基本確立,未來的懸念僅僅是誰能坐穩第二把交椅。
#6. 自動化運維——問問中國的每個運維人員,運維人員必須會的語言是什麼?10個人相信會給你一個相同的答案,它的名字叫Python
#7. 金融分析——我個人之前在金融行業,10年的時候,我們公司寫的好多分析程式、高頻交易軟體就是用的Python,到目前,Python是金融分析、量化交易領域裡用的最多的語言
#8. 科學運算—— 你知道麼,97年開始,NASA就在大量使用Python在進行各種複雜的科學運算,隨著NumPy, SciPy, Matplotlib, Enthought librarys等眾多程式庫的開發,使的Python越來越適合於做科學計算、繪製高質量的2D和3D影象。和科學計算領域最流行的商業軟體Matlab相比,Python是一門通用的程式設計語言,比Matlab所採用的指令碼語言的應用範圍更廣泛
#9. 遊戲開發——在網路遊戲開發中Python也有很多應用。相比Lua or C++,Python 比 Lua 有更高階的抽象能力,可以用更少的程式碼描述遊戲業務邏輯,與 Lua 相比,Python 更適合作為一種 Host 語言,即程式的入口點是在 Python 那一端會比較好,然後用 C/C++ 在非常必要的時候寫一些擴充套件。Python 非常適合編寫 1 萬行以上的專案,而且能夠很好地把網遊專案的規模控制在 10 萬行程式碼以內。另外據我所知,知名的遊戲<文明> 就是用Python寫的

Python在一些公司應用

# 谷歌:Google App Engine 、code.google.com 、Google earth 、谷歌爬蟲、Google廣告等專案都在大量使用Python開發
# CIA: 美國中情局網站就是用Python開發的
# NASA: 美國航天局(NASA)大量使用Python進行資料分析和運算
# YouTube:世界上最大的視訊網站YouTube就是用Python開發的
# Dropbox:美國最大的線上雲端儲存網站,全部用Python實現,每天網站處理10億個檔案的上傳和下載
# Instagram:美國最大的圖片分享社交網站,每天超過3千萬張照片被分享,全部用python開發
# Facebook:大量的基礎庫均通過Python實現的
# Redhat: 世界上最流行的Linux發行版本中的yum包管理工具就是用python開發的
# 豆瓣: 公司幾乎所有的業務均是通過Python開發的
# 知乎: 國內最大的問答社群,通過Python開發(國外Quora)
# 春雨醫生:國內知名的線上醫療網站是用Python開發的
# 除上面之外,還有搜狐、金山、騰訊、盛大、網易、百度、阿里、淘寶 、土豆、新浪、果殼等公司都在使用Python完成各種各樣的任務。

五、變數

如何定義變數

#變數名(相當於門牌號,紙箱值所在的空間),等號,變數值

name = 'eron'
sex='male'
age=18
level=10

變數的定義規範

#1. 變數名只能是 字母、數字或下劃線的任意組合
#2. 變數名的第一個字元不能是數字
#3. 關鍵字不能宣告為變數名['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']

定義變數會有:id,type,value

#1 等號比較的是value,
#2 is比較的是id

#強調:
#1. id相同,意味著type和value必定相同
#2. value相同type肯定相同,但id可能不同,如下
>>> x='Info Egon:18'
>>> y='Info Egon:18'
>>> id(x)
4376607152
>>> id(y)
4376607408
>>> 
>>> x == y
True
>>> x is y
False

小整數池

#1、在互動式模式下
Python實現int的時候有個小整數池。為了避免因建立相同的值而重複申請記憶體空間所帶來的效率問題, Python直譯器會在啟動時創建出小整數池,範圍是[-5,256],該範圍內的小整數物件是全域性直譯器範圍內被重複使用,永遠不會被GC回收

每建立一個-5到256之間的整數,都是直接從這個池裡直接拿走一個值,例如
>>> y=4
>>> id(y)
4297641184
>>> 
>>> x=3
>>> x+=1
>>> id(x)
4297641184

#在pycharm中
但在pycharm中執行python程式,pycharm出於對效能的考慮,會擴大小整數池的範圍,其他的字串等不可變型別也都包含在內一便採用相同的方式處理了,我們只需要記住這是一種優化機制,至於範圍到底多大,無需細究

小整數池

變數的修改與記憶體管理(引用計數與垃圾回收機制)

常量

常量即指不變的量,如pai 3.141592653..., 或在程式執行過程中不會改變的量
舉例,假如老男孩老師的年齡會變,那這就是個變數,但在一些情況下,他的年齡不會變了,那就是常量。在Python中沒有一個專門的語法代表常量,程式設計師約定俗成用變數名全部大寫代表常量
AGE_OF_OLDBOY = 56

#ps:在c語言中有專門的常量定義語法,const int count = 60;一旦定義為常量,更改即會報錯 

六、使用者與程式互動

#在python3中
input:使用者輸入任何值,都存成字串型別

#在python2中
input:使用者輸入什麼型別,就存成什麼型別
raw_input:等於python3的input

註釋

程式碼註釋分單行和多行註釋, 單行註釋用#,多行註釋可以用三對雙引號""" """

程式碼註釋的原則:

#1. 不用全部加註釋,只需要在自己覺得重要或不好理解的部分加註釋即可
#2. 註釋可以用中文或英文,但不要用拼音

檔案頭

#!/usr/bin/env python
# -*- coding: utf-8 -*- 

七、基本資料型別

概括地說,程式語言的劃分方式有以下三種

1、編譯型or解釋型

2、強型別or弱型別
2.1 強型別語言: 資料型別不可以被忽略的語言
即變數的資料型別一旦被定義,那就不會再改變,除非進行強轉。
在python中,例如:name = 'egon',這個變數name在被賦值的那一刻,資料型別就被確定死了,是字元型,值為'egon'2.2 弱型別語言:資料型別可以被忽略的語言
比如linux中的shell中定義一個變數,是隨著呼叫方式的不同,資料型別可隨意切換的那種。

3、動態型or靜態型
3.1 動態語言 :執行時才進行資料型別檢查
即在變數賦值時,就確定了變數的資料型別,不用事先給變數指定資料型別

3.2 靜態語言:需要事先給變數進行資料型別定義

所以綜上所述,Python是一門解釋型的強型別動態語言

數字

#int 整型
定義:age= 10 #age = int(10)
用於標識:年齡、等級,身份證號,QQ號,個數

#float浮點型
用於標識:工資、身高、體重
#int(整型)
在32位機器上,整數的位數為32位,取值範圍為-2**31~2**31-1,即-2147483648~2147483647
在64位系統上,整數的位數為64位,取值範圍為-2**63~2**63-1,即-9223372036854775808~9223372036854775807
#long(長整型)
跟C語言不同,Python的長整數沒有指定位寬,即:Python沒有限制長整數數值的大小,但實際上由於機器記憶體有限,我們使用的長整數數值不可能無限大。
注意,自從Python2.2起,如果整數發生溢位,Python會自動將整數資料轉換為長整數,所以如今在長整數資料後面不加字母L也不會導致嚴重後果了。
注意:在Python3裡不再有long型別了,全都是int
>>> a= 2**64
>>> type(a)  #type()是檢視資料型別的方法
<type 'long'>
>>> b = 2**60
>>> type(b)
<type 'int'>

#complex複數型
>>> x=1-2j
>>> x.imag
-2.0
>>> x.real
1.0

其他資料型別(瞭解部分)

字串

#在Python中,加了引號的字元就是字串型別
定義:name='alex' #name= str('alex')
用於標識:描述的內容,如姓名,性別,國籍,種族


#單引號、雙引號、多引號有什麼區別?沒有區別
#多引號什麼作用?作用就是多行字串必須用多引號



#數字可以進行加減乘除等運算,字串呢?讓我大聲告訴你,也能?what ?是的,但只能進行"相加""相乘"運算。
>>> name='egon'
>>> age='18'
>>> name+age #相加其實就是簡單拼接
'egon18'
>>> name*5 
'egonegonegonegonegon'


#注意1:字串相加的效率不高
字串1+字串3,並不會在字串1的基礎上加字串2,而是申請一個全新的記憶體空間存入字串1和字串3,相當字串1與字串3的空間被複制了一次,

#注意2:只能字串加字串,不能字串加其他型別

列表

#在【】內用逗號分隔,可以存放N個人以型別的值
定義:
用於識別:儲存N多個值得情況,比如一個人有多個愛好


#存放多個學生的資訊:姓名,年齡,愛好
>>> students_info=[['egon',18,['play',]],['alex',18,['play','sleep']]]
>>> students_info[0][2][0] #取出第一個學生的第一個愛好
'play'

字典

#為何還要用字典?
存放一個人的資訊:姓名,性別,年齡,很明顯是多個值,既然是存多個值,我們完全可以基於剛剛學習的列表去存放,如下
>>> info=['egon','male',18]
定義列表的目的不單單是為了存,還要考慮取值,如果我想取出這個人的年齡,可以用
>>> info[2]
18
但這是基於我們已經知道在第3個位置存放的是年齡的前提下,我們才知道索引2對應的是年齡
即:
        #name, sex, age
info=['egon','male',18]
而這完全只是一種假設,並沒有真正意義上規定第三個位置存放的是年齡,於是我們需要尋求一種,即可以存放多個任意型別的值,又可以硬性規定值的對映關係的型別,比如key=value,這就用到了字典
#在{}內用逗號分隔,可以存放多個key:value的值,value可以是任意型別
定義:info={'name':'egon','age':18,'sex':18} #info=dict({'name':'egon','age':18,'sex':18})
用於標識:儲存多個值的情況,每個值都有唯一一個對應的key,可以更為方便高效地取值
info={
    'name':'egon',
    'hobbies':['play','sleep'],
    'company_info':{
        'name':'Oldboy',
        'type':'education',
        'emp_num':40,
    }
}
print(info['company_info']['name']) #取公司名


students=[
    {'name':'alex','age':38,'hobbies':['play','sleep']},
    {'name':'egon','age':18,'hobbies':['read','sleep']},
    {'name':'wupeiqi','age':58,'hobbies':['music','read','sleep']},
]
print(students[1]['hobbies'][1]) #取第二個學生的第二個愛好

字典相關的巢狀、取值

布林

#布林值,一個True一個False
#計算機俗稱電腦,即我們編寫程式讓計算機執行時,應該是讓計算機無限接近人腦,或者說人腦能幹什麼,計算機就應該能幹什麼,人腦的主要作用是資料執行與邏輯運算,此處的布林型別就模擬人的邏輯執行,即判斷一個條件成立時,用True標識,不成立則用False標識
>>> a=3
>>> b=5
>>> 
>>> a > b #不成立就是False,即假
False
>>> 
>>> a < b #成立就是True, 即真
True

接下來就可以根據條件結果來幹不同的事情了:
if a > b 
   print(a is bigger than b )

else 
   print(a is smaller than b )
上面是虛擬碼,但意味著, 計算機已經可以像人腦一樣根據判斷結果不同,來執行不同的動作。

布林型別的重點知識!!!:

#所有資料型別都自帶布林值
1、None,0,空(空字串,空列表,空字典等)三種情況下布林值為False
2、其餘均為真 

重點

#1.可變型別:在id不變的情況下,value可以變,則稱為可變型別,如列表,字典

#2. 不可變型別:value一旦改變,id也改變,則稱為不可變型別(id變,意味著建立了新的記憶體空間) 

八、格式化輸出

程式中經常會有這樣場景:要求使用者輸入資訊,然後列印成固定的格式

比如要求使用者輸入使用者名稱和年齡,然後列印如下格式:

My name is xxx,my age is xxx.

很明顯,用逗號進行字串拼接,只能把使用者輸入的名字和年齡放到末尾,無法放到指定的xxx位置,而且數字也必須經過str(數字)的轉換才能與字串進行拼接。

這就用到了佔位符,如:%s、%d

#%s字串佔位符:可以接收字串,也可接收數字
print('My name is %s,my age is %s' %('egon',18))
#%d數字佔位符:只能接收數字
print('My name is %s,my age is %d' %('egon',18))
print('My name is %s,my age is %d' %('egon','18')) #報錯

#接收使用者輸入,列印成指定格式
name=input('your name: ')
age=input('your age: ') #使用者輸入18,會存成字串18,無法傳給%d

print('My name is %s,my age is %s' %(name,age))

#注意:
#print('My name is %s,my age is %d' %(name,age)) #age為字串型別,無法傳給%d,所以會報錯

練習:使用者輸入姓名、年齡、工作、愛好 ,然後列印成以下格式
------------ info of Egon -----------
Name  : Egon
Age   : 22
Sex   : male
Job   : Teacher 
------------- end -----------------

小練習


Name=input('Name : ')
Age=input('Age : ')
Sex=input('Sex : ')
Job=input('Job : ')

print('-'*10+'info of Egon'+'-'*10)
print('Name : %s' %Name)
print('Age : %s' %Age)
print('Sex : %s' %Sex)
print('Job : %s' %Job)
print('-'*10 + ' end '+'-'*10)

九、基本運算子

計算機可以進行的運算有很多種,可不只加減乘除這麼簡單,運算按種類可分為算數運算、比較運算、邏輯運算、賦值運算、成員運算、身份運算、位運算,今天我們暫只學習算數運算、比較運算、邏輯運算、賦值運算

算術運算

+ - * / %(取模,餘數) **冪 // 取整數

比較運算--結果都是布林值

== != <> > < >= <=

賦值運算

= += -= *= /= %= **= //=

邏輯運算

and or not

#1、三者的優先順序關係:not>and>or,同一優先順序預設從左往右計算。
>>> 3>4 and 4>3 or 1==3 and 'x' == 'x' or 3 >3
False

#2、最好使用括號來區別優先順序,其實意義與上面的一樣
'''
原理為:
(1) not的優先順序最高,就是把緊跟其後的那個條件結果取反,所以not與緊跟其後的條件不可分割

(2) 如果語句中全部是用and連線,或者全部用or連線,那麼按照從左到右的順序依次計算即可

(3) 如果語句中既有and也有or,那麼先用括號把and的左右兩個條件給括起來,然後再進行運算
'''
>>> (3>4 and 4>3) or (1==3 and 'x' == 'x') or 3 >3
False 

#3、短路運算:邏輯運算的結果一旦可以確定,那麼就以當前處計算到的值作為最終結果返回
>>> 10 and 0 or '' and 0 or 'abc' or 'egon' == 'dsb' and 333 or 10 > 4
我們用括號來明確一下優先順序
>>> (10 and 0) or ('' and 0) or 'abc' or ('egon' == 'dsb' and 333) or 10 > 4
短路:       0      ''            'abc'                    
            假     假              真

返回:                            'abc'

#4、短路運算面試題:
>>> 1 or 3
1
>>> 1 and 3
3
>>> 0 and 2 and 1
0
>>> 0 and 2 or 1
1
>>> 0 and 2 or 1 or 4
1
>>> 0 or False and 1
False

身份運算

#is比較的是id
#而==比較的是值

十、流程控制之if。。。else

既然我們程式設計的目的是為了控制計算機能夠像人腦一樣工作,那麼人腦能做什麼,就需要程式中有相應的機制去模擬。人腦無非是數學運算和邏輯運算,對於數學運算在上一節我們已經說過了。對於邏輯運算,即人根據外部條件的變化而做出不同的反映,比如

#在表白的基礎上繼續:
#如果表白成功,那麼:在一起
#否則:列印。。。

age_of_girl=18
height=171
weight=99
is_pretty=True

success=False

if age_of_girl >= 18 and age_of_girl < 22 and height > 170 and weight < 100 and is_pretty == True:
    if success:
        print('表白成功,在一起')
    else:
        print('什麼愛情不愛情的,愛nmlgb的愛情,愛nmlg啊...')
else:
    print('阿姨好')

if 條件1:

    縮排的程式碼塊

  elif 條件2:

    縮排的程式碼塊

  elif 條件3:

    縮排的程式碼塊

  ......

  else:  

    縮排的程式碼塊
# 如果:今天是Monday,那麼:上班
# 如果:今天是Tuesday,那麼:上班
# 如果:今天是Wednesday,那麼:上班
# 如果:今天是Thursday,那麼:上班
# 如果:今天是Friday,那麼:上班
# 如果:今天是Saturday,那麼:出去浪
# 如果:今天是Sunday,那麼:出去浪


#方式一:
today=input('>>: ')
if today == 'Monday':
    print('上班')
elif today == 'Tuesday':
    print('上班')
elif today == 'Wednesday':
    print('上班')
elif today == 'Thursday':
    print('上班')
elif today == 'Friday':
    print('上班')
elif today == 'Saturday':
    print('出去浪')
elif today == 'Sunday':
    print('出去浪')
else:
    print('''必須輸入其中一種:
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    Sunday
    ''')

#方式二:
today=input('>>: ')
if today == 'Saturday' or today == 'Sunday':
    print('出去浪')

elif today == 'Monday' or today == 'Tuesday' or today == 'Wednesday' \
    or today == 'Thursday' or today == 'Friday':
    print('上班')

else:
    print('''必須輸入其中一種:
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    Sunday
    ''')


#方式三:
today=input('>>: ')
if today in ['Saturday','Sunday']:
    print('出去浪')
elif today in ['Monday','Tuesday','Wednesday','Thursday','Friday']:
    print('上班')
else:
    print('''必須輸入其中一種:
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    Sunday
    ''')

練習三

十一、流程控制之while迴圈

1 為何要用迴圈

#上節課我們已經學會用if .. else 來猜年齡的遊戲啦,但是隻能猜一次就中的機率太小了,如果我想給玩家3次機會呢?就是程式啟動後,玩家最多可以試3次,這個怎麼弄呢?你總不會想著把程式碼複製3次吧。。。。

age_of_oldboy = 48

guess = int(input(">>:"))

if guess > age_of_oldboy :
    print("猜的太大了,往小裡試試...")

elif guess < age_of_oldboy :
    print("猜的太小了,往大里試試...")

else:
    print("恭喜你,猜對了...")

#第2次
guess = int(input(">>:"))

if guess > age_of_oldboy :
    print("猜的太大了,往小裡試試...")

elif guess < age_of_oldboy :
    print("猜的太小了,往大里試試...")

else:
    print("恭喜你,猜對了...")

#第3次
guess = int(input(">>:"))

if guess > age_of_oldboy :
    print("猜的太大了,往小裡試試...")

elif guess < age_of_oldboy :
    print("猜的太小了,往大里試試...")

else:
    print("恭喜你,猜對了...")

#即使是小白的你,也覺得的太low了是不是,以後要修改功能還得修改3次,因此記住,寫重複的程式碼是程式設計師最不恥的行為。
那麼如何做到不用寫重複程式碼又能讓程式重複一段程式碼多次呢? 迴圈語句就派上用場啦

2 條件迴圈:while,語法如下

while 條件:    
    # 迴圈體 
# 如果條件為真,那麼迴圈體則執行,執行完畢後再次迴圈,重新判斷條件。。。 # 如果條件為假,那麼迴圈體不執行,迴圈終止

#列印0-10
count=0
while count <= 10:
    print('loop',count)
    count+=1

#列印0-10之間的偶數
count=0
while count <= 10:
    if count%2 == 0:
        print('loop',count)
    count+=1

#列印0-10之間的奇數
count=0
while count <= 10:
    if count%2 == 1:
        print('loop',count)
    count+=1

3 死迴圈

import time
num=0
while True:
    print('count',num)
    time.sleep(1)
    num+=1 

4 迴圈巢狀與tag

  tag=True 

  while tag:

    ......

    while tag:

      ........

      while tag:

        tag=False

5 break與continue

#break用於退出本層迴圈
while True:
    print "123"
    break
    print "456"

#continue用於退出本次迴圈,繼續下一次迴圈
while True:
    print "123"
    continue
    print "456"

6 while + else

#與其它語言else 一般只與if 搭配不同,在Python 中還有個while ...else 語句,while 後面的else 作用是指,當while 迴圈正常執行完,中間沒有被break 中止的話,就會執行else後面的語句
count = 0
while count <= 5 :
    count += 1
    print("Loop",count)

else:
    print("迴圈正常執行完啦")
print("-----out of while loop ------")
輸出
Loop 1
Loop 2
Loop 3
Loop 4
Loop 5
Loop 6
迴圈正常執行完啦
-----out of while loop ------

#如果執行過程中被break啦,就不會執行else的語句啦
count = 0
while count <= 5 :
    count += 1
    if count == 3:break
    print("Loop",count)

else:
    print("迴圈正常執行完啦")
print("-----out of while loop ------")
輸出

Loop 1
Loop 2
-----out of while loop ------

6 while迴圈練習題

#1. 使用while迴圈輸出1 2 3 4 5 6     8 9 10

count=1
while count <=10:
if count ==7 :
print(' ',end=' ')
else:
print(count,end=' ')
count += 1

#2. 求1-100的所有數的和
count=1
sum=0
while count <=100:
sum += count
count += 1
print(sum)
#3. 輸出 1-100 內的所有奇數
count=0
while count <=100:
if count%2 == 1:
print(count)
count += 1
#4. 輸出 1-100 內的所有偶數
count=0
while count <=100:
if count%2 == 0:
print(count)
count += 1
#5. 求1-2+3-4+5 ... 99的所有數的和
count=0
sum=0
while count <100:
if count%2 == 0:
sum += count
else:
sum += -count
count +=1
print(sum)
#6. 使用者登陸(三次機會重試) 
count=1
name='lingling'
password='123'
still_count=3
while count <4:
in_name=input('名字: ')
in_pass=input('密碼: ')
if in_name!=name or in_pass!=password:
still_count = still_count - 1
if still_count > 0:
print('名字或密碼錯誤,請再次輸入名字和密碼,仍有%s次機會' %still_count)
else:
print('已超過3次機會,賬戶將被鎖定')
count +=1

#
7:猜年齡遊戲 要求: 允許使用者最多嘗試3次,3次都沒猜對的話,就直接退出,如果猜對了,列印恭喜資訊並退出 #8:猜年齡遊戲升級版 要求: 允許使用者最多嘗試3次
每嘗試3次後,如果還沒猜對,就問使用者是否還想繼續玩,如果回答Y或y, 就繼續讓其猜3次,以此往復,如果回答N或n,就退出程式 如何猜對了,就直接退出

import sys
answer = 1
while answer == 1: ##確定後續的反覆迴圈
count=1
name='lingling'
password='123'
still_count=3
while count <4: ##確定密碼迴圈次數
in_name=input('名字: ')
in_pass=input('密碼: ')
if in_name!=name or in_pass!=password:
still_count = still_count - 1
if still_count > 0:
print('名字或密碼錯誤,請再次輸入名字和密碼,仍有%s次機會' %still_count)
else:
to_answer=input('已超過3次機會,你是否繼續玩,請給出你的答案(Y/N):') ###確定是否繼續迴圈,需要回到迴圈條件
if to_answer in ['y','Y']:
answer=1
else:
answer=0
else:
print('恭喜你答對了,退出')
sys.exit()
count +=1



age = 73
count=0
while True:
if count == 3:
choice = input('Y OR N')
if choice == 'Y' or choice == 'y':
count=0
else:
break
guess = int(input('你猜的數字: '))
if guess == age:
print('你猜對了')
break
count +=1

十二、流程控制之for迴圈

1 迭代式迴圈:for,語法如下

  for i in range(10):

    縮排的程式碼塊

2 break與continue(同上)

3 迴圈巢狀

for i in range(10):
    for j in range(1,i+1):
        print('%s * %s = %s'%(i,j,i*j),end='  ')
    print()
for i in range(1,6):
    for j in range(6-i):
        print(' ',end='')
    for m in range(2*i - 1):
        print('*',end='')
    for j in range(6-i):
        print(' ',end='')
    print('')
    i +=1

十三、流程控制之for迴圈與while迴圈的區別

一、迴圈bai的結構不du同

for迴圈的表示式為:for(單次表示式;條件表dao達式;末尾迴圈體zhuan){中間迴圈體;}。

while迴圈的表示式為:while(表示式){迴圈體}。

二、執行條件的判斷方式不同

for迴圈執行末尾迴圈體後將再次進行條件判斷,若條件還成立,則繼續重複上述迴圈,當條件不成立時則跳出當下for迴圈。

while迴圈當滿足條件時進入迴圈,進入迴圈後,當條件不滿足時,執行完迴圈體內全部語句後再跳出(而不是立即跳出迴圈)。

三、使用的目的不同

for迴圈的目的是為了限制迴圈體的執行次數,使結果更精確。

while迴圈的目的是為了反覆執行語句或程式碼塊。

四、語法不同

for迴圈的語法為:for (變數 = 開始值;變數 <= 結束值;變數 = 變數 + 步進值) {需執行的程式碼 }。

while迴圈的語法為:while (<條件>) {需執行的程式碼 }。

十四、開發工具IDE

1 為何要用IDE

到現在為止,我們也是寫過程式碼的人啦,但你有沒有發現,每次寫程式碼要新建檔案、寫完儲存時還要選擇存放地點,執行時還要切換到命令列呼叫python直譯器,好麻煩呀,能否一氣呵成,讓我簡單的寫程式碼?此時開發工具IDE上場啦,一個好的IDE能幫你大大提升開發效率。

很多語言都有比較流行的開發工具,比如JAVA 的Eclipse, C#,C++的VisualStudio, Python的是啥呢? Pycharm,最好的Python 開發IDE

2 安裝

十五、作業

1 練習題

  1. 簡述編譯型與解釋型語言的區別,且分別列出你知道的哪些語言屬於編譯型,哪些屬於解釋型

    編譯型:編譯後程序執行時不需要重新翻譯,直接使用編譯的結果就行了。程式執行效率高,依賴編譯器,跨平臺性差些。如C、C++、Delphi等解釋類:
    解釋型:執行方式類似於我們日常生活中的“同聲翻譯”,應用程式原始碼一邊由相應語言的直譯器“翻譯”成目的碼(機器語言),一邊執行,因此效率比較低,
    而且不能生成可獨立執行的可執行檔案,應用程式不能脫離其直譯器(想執行,必須先裝上直譯器,就像跟老外說話,必須有翻譯在場),
    但這種方式比較靈活,可以動態地調整、修改應用程式。如Python、Java、PHP、Ruby等語言。

  2. 執行 Python 指令碼的兩種方式是什麼
    #進入直譯器的互動式模式:除錯方便,無法永久儲存程式碼
    
    #指令碼檔案的方式(使用nodpad++演示):永久儲存程式碼

  3. Pyhton 單行註釋和多行註釋分別用什麼?
    單行:單引號或者雙引號
    
    多行:三引號

  4. 布林值分別有什麼?
    #布林值,一個True一個False
    #計算機俗稱電腦,即我們編寫程式讓計算機執行時,應該是讓計算機無限接近人腦,或者說人腦能幹什麼,計算機就應該能幹什麼,人腦的主要作用是資料執行與邏輯運算,此處的布林型別就模擬人的邏輯執行,即判斷一個條件成立時,用True標識,不成立則用False標識

  5. 宣告變數注意事項有那些?
  6. 如何檢視變數在記憶體中的地址?
    y=54
    print(id(y))

  7. 寫程式碼
    1. 實現使用者輸入使用者名稱和密碼,當用戶名為 seven 且 密碼為 123 時,顯示登陸成功,否則登陸失敗!
    2. 實現使用者輸入使用者名稱和密碼,當用戶名為 seven 且 密碼為 123 時,顯示登陸成功,否則登陸失敗,失敗時允許重複輸入三次
    3. 實現使用者輸入使用者名稱和密碼,當用戶名為 seven 或 alex 且 密碼為 123 時,顯示登陸成功,否則登陸失敗,失敗時允許重複輸入三次
      #!/usr/bin/env python
      #-*- coding:utf-8 -*-
      #author:Amily wang

      '''
      讓使用者輸入使用者名稱密碼
      認證成功後退出
      輸入錯誤有三次機會再輸入
      '''

      count = 1
      while count <=3:
      name = input('請輸入使用者名稱: ')
      password = input('請輸入密碼: ')
      if name=='seven' and password=='123':
      print('succuss!')
      break
      else:
      if count <3:
      count +=1
      print('fail!,您可繼續輸入密碼')
      else:
      print('您已連續輸入3次錯誤密碼,暫時不可登入')
      break

  8. 寫程式碼
    a. 使用while迴圈實現輸出2-3+4-5+6...+100 的和
    b. 使用 while 迴圈實現輸出 1,2,3,4,5, 7,8,9, 11,12 使用 while 迴圈實現輸出 1-100 內的所有奇數

    e. 使用 while 迴圈實現輸出 1-100 內的所有偶數

  9. 現有如下兩個變數,請簡述 n1 和 n2 是什麼關係?

      n1 = 123456
      n2 = n1

2 作業:編寫登陸介面

基礎需求:

  • 讓使用者輸入使用者名稱密碼
  • 認證成功後顯示歡迎資訊
  • 輸錯三次後退出程式

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Hiuhung Wan
 
'''
讓使用者輸入使用者名稱密碼
認證成功後顯示歡迎資訊
使用者3次認證失敗後,退出程式,再次啟動程式嘗試登入時,還是鎖定狀態
'''
 
dic_user_info = {
    "usera": {"pw": "123", "err_count": 0},
    "userb": {"pw": "123", "err_count": 0},
    "userc": {"pw": "123", "err_count": 0},
    "userd": {"pw": "123", "err_count": 0},
    "usere": {"pw": "123", "err_count": 0},
}
# 建立一個黑名單檔案,這裡把usera列入黑名單
try:
    with open('blacklist.txt', 'r') as f:
        if not f.read():  # 沒有內容,就寫入
            with open('blacklist.txt', 'a') as f:
                f.write("usera,")
except FileNotFoundError as e:   # 沒有這個檔案,就建立並寫入內容
    with open('blacklist.txt', 'a') as f:
        f.write("usera,")
finally:
    f.close()   # 關閉檔案。
 
 
for i in range(100):
    username = input("請輸入使用者名稱(按q退出程式):")
    # 按q退出程式
    if username == 'q':
        exit()
 
    # 使用者名稱不在字典中
    elif username not in dic_user_info:
        print("無此賬戶,請檢查您的輸入")
        continue
 
    # 使用者在字典中,但被鎖定
    with open('blacklist.txt', 'r') as f:
        user_locked_list = f.read().split(",")
        if username in user_locked_list:
            print("賬戶%s已被鎖定。。。請更換另一個賬戶" % username)
            f.close()
            continue
        f.close()
 
    # 使用者在字典中,也未被鎖定,則提示輸入密碼
    password = input("請輸入密碼:")
    if password == dic_user_info[username]["pw"]:    # 密碼正確
        print("歡迎【%s】登入系統。。。" % username)
        break
    else:   # 密碼錯
        dic_user_info[username]["err_count"] += 1  # 記錄錯誤次數
        if dic_user_info[username]["err_count"] < 3:
            print("密碼不對,您已經輸錯%d次密碼了,輸錯3次賬戶將被鎖定" % dic_user_info[username]["err_count"])
        else:   # dic_user_info[username]["err_count"] >= 3:  # 輸錯3次,錄入黑名單資料庫
            with open('blacklist.txt', 'a') as f:
                f.write("%s," % username)
                f.close()
                print("輸錯3次密碼,此賬戶已加入黑名單")
                break