1. 程式人生 > 實用技巧 >(一)python基礎

(一)python基礎

一、程式設計與程式語言


python是一門程式語言,作為學習python的開始,需要事先搞明白:程式設計的目的是什麼?什麼是程式語言?什麼是程式設計?

1,程式設計的目的:

計算機的發明,是為了用機器取代 / 解放人力,而程式設計的目的則是將人類的思想流程按照某種能夠被計算機識別的表達方式傳給計算機,從而達到讓計算機能夠像人腦 / 電腦一樣自動執行的效果。

2,什麼是程式語言?

上面提及的能夠被計算機所識別的表達方式即程式語言,語言是溝通的介質,而程式語言是程式設計師與計算機溝通的介質。在程式設計的世界裡,計算機更像是人的奴隸,人類程式設計的目的就是命令奴隸去工作。

3,什麼是程式設計?

程式設計即程式設計師根據需求把自己的思想流程按照某種程式語言的語法風格編寫下來,產出的結果就是包含一堆字元的檔案。

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

二、程式語言分類


1,程式語言的發展經歷了:

1)機器語言:站在計算機(奴隸)的角度,說計算機能聽懂的語言,那就是直接用二進位制程式設計,直接操作硬體。

2)組合語言:站在計算機(奴隸)的角度,簡寫的英文識別符號取代二進位制去編寫程式,本質任然是直接操作硬體。

3)高階語言:站在人(奴隸主)的角度,說人話,即用人類的字元去編寫程式,遮蔽了硬體操作。

高階語言更貼近人類語言,因而造成了:

它必須被翻譯成計算機能讀懂的二進位制語言,才能被執行,

2,按照翻譯方式分為:

1)編譯型(需要編譯器,相當於用谷歌軟體翻譯):

如:C,執行速度快,除錯麻煩。

2)解釋型(需要直譯器,相當於同聲傳譯):

如:python,執行速度慢,但除錯方便

總結:

機器語言
#優點是最底層,執行速度最快
#缺點是最複雜,開發效率最低

組合語言
#優點是比較底層,執行速度最快
#缺點是複雜,開發效率最低

高階語言
#編譯型語言執行速度快,不依賴語言環境執行,跨平臺差
#解釋型跨平臺好,一份程式碼,到處使用,缺點是執行速度慢,依賴直譯器執行

tips:

1)學習難度從高到低

2)執行效率從高到低

3)開發效率從低到高

速度不是關鍵(瓶頸理論),開發效率高才是王道

#機器語言
由於計算機內部只能接受二進位制程式碼,因此,用二進位制程式碼0和1描述的指令稱為機器指令,全部機器指令的集合構成計算機的機器語言,用機器語言程式設計的程式稱為目標程式。只有目標程式才能被計算機直接識別和執行。但是機器語言編寫的程式無明顯特徵,難以記憶,不便閱讀和書寫,且依賴於具體機種,侷限性很大,機器語言屬於低階語言。
用機器語言編寫程式,程式設計人員要首先熟記所用計算機的全部指令程式碼和程式碼的涵義。手程式設計序時,程式設計師得自己處理每條指令和每一資料的儲存分配和輸入輸出,還得記住程式設計過程中每步所使用的工作單元處在何種狀態。這是一件十分繁瑣的工作。編寫程式花費的時間往往是實際執行時間的幾十倍或幾百倍。而且,編出的程式全是些0和1的指令程式碼,直觀性差,還容易出錯。除了計算機生產廠家的專業人員外,絕大多數的程式設計師已經不再去學習機器語言了。
機器語言是微處理器理解和使用的,用於控制它的操作二進位制程式碼。
儘管機器語言好像是很複雜的,然而它是有規律的。
存在著多至100000種機器語言的指令。這意味著不能把這些種類全部列出來。
以下是一些示例:
指令部份的示例
0000 代表 載入(LOAD) 0001 代表 儲存(STORE) ... 暫存器部份的示例 0000 代表暫存器 A 0001 代表暫存器 B ... 儲存器部份的示例 000000000000 代表地址為 0 的儲存器 000000000001 代表地址為 1 的儲存器 000000010000 代表地址為 16 的儲存器 100000000000 代表地址為 2^11 的儲存器 整合示例 0000,0000,000000010000 代表 LOAD A, 16 0000,0001,000000000001 代表 LOAD B, 1 0001,0001,000000010000 代表 STORE B, 16 0001,0001,000000000001 代表 STORE B, 1[1] #組合語言 組合語言的實質和機器語言是相同的,都是直接對硬體操作,只不過指令採用了英文縮寫的識別符號,更容易識別和記憶。它同樣需要程式設計者將每一步具體的操作用命令的形式寫出來。彙編程式的每一句指令只能對應實際操作過程中的一個很細微的動作。例如移動、自增,因此彙編源程式一般比較冗長、複雜、容易出錯,而且使用匯編語言程式設計需要有更多的計算機專業知識,但組合語言的優點也是顯而易見的,用匯編語言所能完成的操作不是一般高階語言所能夠實現的,而且源程式經彙編生成的可執行檔案不僅比較小,而且執行速度很快。 彙編的hello world,列印一句hello world, 需要寫十多行,也是醉了。 ; hello.asm section .data ; 資料段宣告 msg db "Hello, world!", 0xA ; 要輸出的字串 len equ $ - msg ; 字串長度 section .text ; 程式碼段宣告 global _start ; 指定入口函式 _start: ; 在螢幕上顯示一個字串 mov edx, len ; 引數三:字串長度 mov ecx, msg ; 引數二:要顯示的字串 mov ebx, 1 ; 引數一:檔案描述符(stdout) mov eax, 4 ; 系統呼叫號(sys_write) int 0x80 ; 呼叫核心功能 ; 退出程式 mov ebx, 0 ; 引數一:退出程式碼 mov eax, 1 ; 系統呼叫號(sys_exit) int 0x80 ; 呼叫核心功能 #高階語言 高階語言是大多數程式設計者的選擇。和組合語言相比,它不但將許多相關的機器指令合成為單條指令,並且去掉了與具體操作有關但與完成工作無關的細節,例如使用堆疊、暫存器等,這樣就大大簡化了程式中的指令。同時,由於省略了很多細節,程式設計者也就不需要有太多的專業知識。 高階語言主要是相對於組合語言而言,它並不是特指某一種具體的語言,而是包括了很多程式語言,像最簡單的程式語言PASCAL語言也屬於高階語言。 高階語言所編制的程式不能直接被計算機識別,必須經過轉換才能被執行,按轉換方式可將它們分為兩類: 編譯類:編譯是指在應用源程式執行之前,就將程式原始碼“翻譯”成目的碼(機器語言),因此其目標程式可以脫離其語言環境獨立執行(編譯後生成的可執行檔案,是cpu可以理解的2進位制的機器碼組成的),使用比較方便、效率較高。但應用程式一旦需要修改,必須先修改原始碼,再重新編譯生成新的目標檔案(* .obj,也就是OBJ檔案)才能執行,只有目標檔案而沒有原始碼,修改很不方便。 編譯後程序執行時不需要重新翻譯,直接使用編譯的結果就行了。程式執行效率高,依賴編譯器,跨平臺性差些。如C、C++、Delphi等 解釋類:執行方式類似於我們日常生活中的“同聲翻譯”,應用程式原始碼一邊由相應語言的直譯器“翻譯”成目的碼(機器語言),一邊執行,因此效率比較低,而且不能生成可獨立執行的可執行檔案,應用程式不能脫離其直譯器(想執行,必須先裝上直譯器,就像跟老外說話,必須有翻譯在場),但這種方式比較靈活,可以動態地調整、修改應用程式。如Python、Java、PHP、Ruby等語言。
機器語言,組合語言,高階語言詳解

三、python 介紹


1,簡介:

Python 的創始人為吉多·範羅蘇姆(Guido van Rossum)。1989年的聖誕節期間,Guido開始寫能夠解釋Python 語言語法的直譯器。Python這個名字,來自Guido所摯愛的電視劇Monty Python’s Flying Circus。他希望這個新的叫做Python的語言,能符合他的理想:創造一種C和shell之間,功能全面,易學易用,可拓展的語言。

最新的TIOBE排行榜,Python趕超PHP佔據第4, Python崇尚優美、清晰、簡單,是一個優秀並廣泛使用的語言。

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

2,目前 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寫的
View Code

3,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完成各種各樣的任務。
View Code

4,python(直譯器)的發展史

# 1989年,Guido開始寫Python語言的編譯器。
# 1991年,第一個Python編譯器誕生。它是用C語言實現的,並能夠呼叫C語言的庫檔案。從一出生,Python已經具有了:類,函式,異常處理,包含表和詞典在內的核心資料型別,以及模組為基礎的拓展系統。
# Granddaddy of Python web frameworks, Zope 1 was released in 1999
# Python 1.0 - January 1994 增加了 lambda, map, filter and reduce.
# Python 2.0 - October 16, 2000,加入了記憶體回收機制,構成了現在Python語言框架的基礎
# Python 2.4 - November 30, 2004, 同年目前最流行的WEB框架Django 誕生
# Python 2.5 - September 19, 2006
# Python 2.6 - October 1, 2008
# Python 2.7 - July 3, 2010
# In November 2014, it was announced that Python 2.7 would be supported until 2020, and reaffirmed that there would be no 2.8 release as users were expected to move to Python 3.4+ as soon as possible
# Python 3.0 - December 3, 2008 (這裡要解釋清楚 為什麼08年就出3.0,2010年反而又推出了2.7?是因為3.0不向下相容2.0,導致大家都拒絕升級3.0,無奈官方只能推出2.7過渡版本)
# Python 3.1 - June 27, 2009
# Python 3.2 - February 20, 2011
# Python 3.3 - September 29, 2012
# Python 3.4 - March 16, 2014
# Python 3.5 - September 13, 2015
# Python 3.6 - 2016-12-23 釋出python3.6.0版
View Code

5,python 有哪些種類?

我們現在知道了Python是一門解釋型語言,程式碼想執行,必須通過直譯器執行,Python的直譯器本身也可以看作是個程式(翻譯官司是哪國人不重要),這個程式是什麼語言開發的呢? 答案是好幾種語言? what? 因為Python有好幾種直譯器,分別基於不同語言開發,每個直譯器特點不同,但都能正常執行我們的Python程式碼,下面分別來看下:

#CPython:CPython是使用最廣且被的Python直譯器。本教程以CPython為準。
當我們從Python官方網站下載並安裝好Python 2.7後,我們就直接獲得了一個官方版本的直譯器:CPython。這個直譯器是用C語言開發的,所以叫CPython。在命令列下執行python就是啟動CPython直譯器。

#IPython
IPython是基於CPython之上的一個互動式直譯器,也就是說,IPython只是在互動方式上有所增強,但是執行Python程式碼的功能和CPython是完全一樣的。好比很多國產瀏覽器雖然外觀不同,但核心其實都是呼叫了IE。
CPython用>>>作為提示符,而IPython用In [序號]:作為提示符。

#PyPy
PyPy是另一個Python直譯器,它的目標是執行速度。PyPy採用JIT技術,對Python程式碼進行動態編譯(注意不是解釋),所以可以顯著提高Python程式碼的執行速度。
絕大部分Python程式碼都可以在PyPy下執行,但是PyPy和CPython有一些是不同的,這就導致相同的Python程式碼在兩種直譯器下執行可能會有不同的結果。如果你的程式碼要放到PyPy下執行,就需要了解PyPy和CPython的不同點。

#Jython
Jython是執行在Java平臺上的Python直譯器,可以直接把Python程式碼編譯成Java位元組碼執行。

#IronPython
IronPython和Jython類似,只不過IronPython是執行在微軟.Net平臺上的Python直譯器,可以直接把Python程式碼編譯成.Net的位元組碼。

6,python2 or python3?

In summary : Python 2.x is legacy, Python 3.x is the present and future of the language
Python 3.0 was released in 2008. The final 2.x version 2.7 release came out in mid-2010, with a statement of
extended support for this end-of-life release. The 2.x branch will see no new major releases after that. 3.x is
under active development and has already seen over five years of stable releases, including version 3.3 in 2012,+

3.4 in 2014, and 3.5 in 2015. This means that all recent standard library improvements, for example, are only
available by default in Python 3.x.
Guido van Rossum (the original creator of the Python language) decided to clean up Python 2.x properly, with less regard for backwards compatibility than is the case for new releases in the 2.x range. The most drastic improvement is the better Unicode support (with all text strings being Unicode by default) as well as saner bytes/Unicode separation.
Besides, several aspects of the core language (such as print and exec being statements, integers using floor division) have been adjusted to be easier for newcomers to learn and to be more consistent with the rest of the language, and old cruft has been removed (for example, all classes are now new-style, "range()" returns a memory efficient iterable, not a list as in 2.x).
目前雖然業內很多企業還在大量使用Python2.6 or 2.7,因為舊專案幾十萬甚至上百萬行的程式碼想快速升級到3.0不是件容易的事,但是大家在開發新專案時幾乎都會使用3.x。
另外Python3 確實想比2.x做了很多的改進,直觀點來講,就像從XP升級到Win7的感覺一樣,棒棒的。
Py2 和Py3的具體細節區別我們在以後課程中會慢慢深入。
View Code

四、第一個 python 程式


注意:

# 進入直譯器的互動式模式:除錯方便,無法永久儲存程式碼

# 指令碼檔案的方式(使用vscode演示):永久儲存程式碼

強調:python 直譯器執行程式是解釋執行,即開啟檔案讀內容,因此檔案的字尾名沒有硬性限制,但通常定義為.py結尾。

#C++
#include <iostream>
 int main(void)
 {
  std::cout<<"Hello world";
 }

#C
#include <stdio.h>
int main(void)
{
printf("\nhello world!");
return 0;
}

#JAVA
public class HelloWorld{
  // 程式的入口
  public static void main(String args[]){
    // 向控制檯輸出資訊
    System.out.println("Hello World!");
  }
}

#PHP
<?php  
             echo "hello world!";  
?>

#Ruby
日本人開發的,砸日本車的時候,順手就把你拖出去打死了,祭天
 puts "Hello world."

#GO
package main
import "fmt"
func main(){

    fmt.Printf("Hello World!\n God Bless You!");

}
hello world 在各種語言中的實現

五、變數


1,什麼是變數?

是用於在記憶體中存放程式資料的容器,變數即變化的量,核心是 “變” 與 “量” 二字,變即變化,量即衡量狀態。

2,為什麼要有變數?

程式執行的本質就是一些列狀態的變化,變是程式執行的直接體現,所以我們需要有一種機制能夠反映或者說是儲存下來程式執行時狀態以及狀態的變化。

如:

  英雄的等級為1,打怪升級(變)為10

  殭屍的存活狀態 True ,被植物打死了,於是變為 False

  人的名字為 zoling,也可以修改為 ZOLING

3,如何定義變數

變數名(相當於門牌號,指向值所在的空間),等號,變數值

name = "zoling"

sex = "male"

age = 18

4,變數定義的規範:

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']
關鍵字例子

5,定義方式:

# 建議使用下劃線 或者 駝峰命名法
user_name = "zoling"

UserAge = 18

6,定義變數名不好的方式

1)用中文或拼音

2)太長

3)詞不達意

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

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

# 強調:
# 1,id相同,意味著type和value必定相同
# 2,value相同type肯定相同,但id可能不同,如下:

>>> x="託兒所:18"
>>> y="託兒所:18"
>>>
>>> id(x)
2040059320504
>>> id(y)
2040061909488
>>>
>>> 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出於對效能的考慮,會擴大小整數池的範圍,其他的字串等不可變型別也都包含在內一便採用相同的方式處理了,我們只需要記住這是一種優化機制,至於範圍到底多大,無需細究
小整數池

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

9,常量:

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

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

六、使用者與程式互動


古時候,我們去銀行取錢,需要有一個銀行業務員等著我們把自己的賬號密碼輸入給他,然後他去進行驗證,成功後,我們再將取款金額輸入告訴他。

驕傲的現代人,會為客戶提供一臺ATM機(就是一臺計算機),讓ATM機跟使用者互動,從而取代人力。然而機器是死的,我們必須為其編寫程式來執行,這就要求我們的程式語言中能夠有一種能與使用者互動,接收使用者輸入資料的機制。

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

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

註釋:

隨著學習的深入,用不了多久,你就可以寫複雜的上千甚至上萬行的程式碼啦,有些程式碼你花了很久寫出來,過了些天再回去看,發現竟然看不懂了,這太正常了。 另外,你以後在工作中會發現,一個專案多是由幾個甚至幾十個開發人員一起做,你要呼叫別人寫的程式碼,別人也要用你的,如果程式碼不加註釋,你自己都看不懂,更別說別人了,這會捱打的。所以為了避免這種尷尬的事情發生,一定要增加你程式碼的可讀性。

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

程式碼註釋的原則:

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

檔案頭:

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

七、基本資料型別


什麼是資料?為何要有多種型別的資料?

# 資料即變數的值,如age=18,18則是我們儲存的資料。
# 變數是用來反映保持狀態以及狀態變化的,毫無疑問針對不同的狀態就應該用不同型別的資料去標識
概括地說,程式語言的劃分方式有以下三種

1、編譯型or解釋型

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

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

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

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

1,數字

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

# float浮點型
定義:salary=3.1     # salary=float(3.1)
用於標識:工資,身高,體重,
#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
其他資料型別(瞭解)

2,字串

# 在python中,加了引號的字元就是字串型別,python並沒有字元型別。
定義:name='zixi'       # name=str('zixi') 
用於標識:描述性的內容,如姓名,性別,國籍,種族
# 那單引號、雙引號、多引號有什麼區別呢? 單雙引號木有任何區別,只有下面這種情況 你需要考慮單雙的配合
msg = "My name is zixi , I'm 18 years old!"

#多引號什麼作用呢?作用就是多行字串必須用多引號
msg = '''
今天我想寫首小詩,
歌頌我的同桌,
你看他那烏黑的短髮,
好像一隻炸毛雞。
'''
print(msg)
單引號,雙引號,三引號的區別
# 數字可以進行加減乘除等運算,字串呢?讓我大聲告訴你,也能?what ?是的,但只能進行"相加"和"相乘"運算。
>>> name = "zixi"
>>> age = "18"
>>>
>>> name + age          # 相加其實就是簡單的拼接
'zixi18'
>>> name * 5
'zixizixizixizixizixi'
>>>

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

# 注意2:只能字串加字串,不能字串加其他型別
字串拼接(只能在字串之間進行,且只能相加或相減)

3,列表

# 在[]內用逗號分隔,可以存放n個任意型別的值
定義:students=['zixi','zoling','shuise'] # students=list(["zixi","zoling","shuise"]) 
用於標識:儲存多個值的情況,比如一個人有多個愛好
# 存放多個學生的資訊:姓名,年齡,愛好
>>> students_info
[['zixi', 18, ['play']], ['zoling', 18, ['play', 'sleep']]]
>>> students_info[0][2][0]              # 取出第一個學生的第一個愛好
'play'
>>>
列表巢狀,取值

4,字典

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


students = [
    {'name':'託兒所','age':38,'hobbies':['play','sleep']},
    {'name':'兒童劫','age':18,'hobbies':['read','sleep']},
    {'name':'魚尾雯','age':58,'hobbies':['music','read','sleep']},
]
print(students[1]['hobbies'][1])        # 取第二個學生的第二個愛好,sleep
字典相關的巢狀,取值

5,布林

# 布林值,一個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' %('zixi',18))
# %d數字佔位符:只能接收數字
print('My name is %s,my age is %d' %('zixi',18))
print('My name is %s,my age is %d' %('zixi','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 Zoling -----------
Name  : Zoling
Age   : 18
Sex   : male
Job   : liumang
------------- end -----------------
練習

九、基本運算子


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

以下假設變數:a = 10,b = 20

1,算術運算子

2,比較運算子

3,賦值運算子

4,邏輯運算子

# 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

5,身份運算

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

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


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

1,如果:女人的年齡 > 30 歲,那麼:叫阿姨

age_of_girl = 31
if age_of_girl > 30:
    print('阿姨好')

2,如果:女人的年齡>30歲,那麼:叫阿姨,否則:叫小姐姐

age_of_girl = 18
if age_of_girl > 30:
    print('阿姨好')
else:
    print('小姐姐好')

3,如果:女人的年齡>=18並且<22歲並且身高>170並且體重<100並且是漂亮的,那麼:表白,否則:叫阿姨

age_of_girl=18
height=171
weight=99
is_pretty=True
if age_of_girl >= 18 and age_of_girl < 22 and height > 170 and weight < 100 and is_pretty == True:
    print('表白...')else:
    print('阿姨好')
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的愛情......')
else:
    print('阿姨好')
if 套 if

4,例子:

成績>=90,那麼:優秀

如果成績>=80且<90,那麼:良好

如果成績>=70且<80,那麼:普通

其他情況:很差

score=input('>>: ')
score=int(score)

if score >= 90:
    print('優秀')
elif score >= 80:
    print('良好')
elif score >= 70:
    print('普通')
else:
    print('很差')
View Code
if 條件1:

    縮排的程式碼塊

  elif 條件2:

    縮排的程式碼塊

  elif 條件3:

    縮排的程式碼塊

  ......

  else:  

    縮排的程式碼塊
name = input('請輸入使用者名稱字:')
password = input('請輸入密碼:')

if name == 'zixi' and password == '007':
    print('zixi login success')
else:
    print('username or password error.')
練習一:使用者登入驗證
# 根據使用者輸入內容列印其許可權
"""
zixi --> 超級管理員
tom  --> 普通管理員
jack,rain --> 業務主管
其他 --> 普通使用者
"""
name = input('請輸入使用者名稱字:')

if name == 'zixi':
    print('超級管理員')
elif name == 'tom':
    print('普通管理員')
elif name == 'jack' or name == 'rain':
    print('業務主管')
else:
    print('普通使用者')
練習二:根據使用者輸入內容輸出其許可權
# 如果:今天是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 = 48
guess = int(input(">>:"))

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

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

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

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

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

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

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

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

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

elif guess < age :
    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,練習,要求如下:

1)迴圈驗證使用者輸入的使用者名稱和密碼

2)認證通過後,執行使用者重複執行命令

3)當用戶輸入命令為 quit 時,則退出整個程式

# 實現一:
name = 'zixi'
password = '007'

while True:
    inp_name = input('使用者名稱: ')
    inp_pwd = input('密碼: ')
    if inp_name == name and inp_pwd == password:
        while True:
            cmd = input('>>: ')
            if not cmd:continue
            if cmd == 'quit':
                break
            print('run <%s>' %cmd)
    else:
        print('使用者名稱或密碼錯誤')
        continue
    break

# 實現二:使用tag
name = 'zixi'
password = '007'

tag = True
while tag:
    inp_name = input('使用者名稱: ')
    inp_pwd = input('密碼: ')
    if inp_name == name and inp_pwd == password:
        while tag:
            cmd = input('>>: ')
            if not cmd:continue
            if cmd == 'quit':
                tag = False
                continue
            print('run <%s>' %cmd)
    else:
        print('使用者名稱或密碼錯誤')
View Code

6,break 與 continue

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

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

7,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 ------
View Code

8,練習題

# 1. 使用while迴圈輸出1 2 3 4 5 6     8 9 10
# 2. 求1-100的所有數的和
# 3. 輸出 1-100 內的所有奇數
# 4. 輸出 1-100 內的所有偶數
# 5. 求1-2+3-4+5 ... 99的所有數的和
# 6. 使用者登陸(三次機會重試)
# 7:猜年齡遊戲
要求:
    允許使用者最多嘗試3次,3次都沒猜對的話,就直接退出,如果猜對了,列印恭喜資訊並退出
#8:猜年齡遊戲升級版 
要求:
    允許使用者最多嘗試3次
    每嘗試3次後,如果還沒猜對,就問使用者是否還想繼續玩,如果回答Y或y, 就繼續讓其猜3次,以此往復,如果回答N或n,就退出程式
    如何猜對了,就直接退出
#題一
count=1
while count <= 10:
    if count == 7:
        count+=1
        continue
    print(count)
    count+=1
    

count=1
while count <= 10:
    if count != 7:
        print(count)
    count+=1
    

#題目二
res=0
count=1
while count <= 100:
    res+=count
    count+=1
print(res)

#題目三
count=1
while count <= 100:
    if count%2 != 0:
        print(count)
    count+=1
    
#題目四
count=1
while count <= 100:
    if count%2 == 0:
        print(count)
    count+=1
    
    
    
#題目五
res=0
count=1
while count <= 5:
    if count%2 == 0:
        res-=count
    else:
        res+=count
    count+=1
print(res)
    

#題目六
count=0
while count < 3:
    name=input('請輸入使用者名稱:')
    password=input('請輸入密碼:')
    if name == 'egon' and password == '123':
        print('login success')
        break
    else:
        print('使用者名稱或者密碼錯誤')
        count+=1

#題目七
age_of_oldboy=73

count=0
while count < 3:
    guess=int(input('>>: '))
    if guess == age_of_oldboy:
        print('you got it')
        break
    count+=1

#題目八
age_of_oldboy=73

count=0
while True:
    if count == 3:
        choice=input('繼續(Y/N?)>>: ')
        if choice == 'Y' or choice == 'y':
            count=0
        else:
            break

    guess=int(input('>>: '))
    if guess == age_of_oldboy:
        print('you got it')
        break
    count+=1
View Code

十二、流程控制之 for 迴圈


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

for i in range(10):
    # 縮排的程式碼塊
    print(i)

2,break 與 continue(同while中的)

3,迴圈巢狀

for i in range(1,10):
    for j in range(1,i+1):
        print('%s*%s=%s' %(i,j,i*j),end=' ')
    print()
列印九九乘法表
#分析
'''

             #max_level=5
    *        #current_level=1,空格數=4,*號數=1
   ***       #current_level=2,空格數=3,*號數=3
  *****      #current_level=3,空格數=2,*號數=5
 *******     #current_level=4,空格數=1,*號數=7
*********    #current_level=5,空格數=0,*號數=9

#數學表示式
空格數=max_level-current_level
*號數=2*current_level-1

'''

#實現
max_level=5
for current_level in range(1,max_level+1):
    for i in range(max_level-current_level):
        print(' ',end='') #在一行中連續列印多個空格
    for j in range(2*current_level-1):
        print('*',end='') #在一行中連續列印多個空格
    print()
列印金字塔

4,for + else

十三、練習題


1,練習題

1,簡述編譯型與解釋型語言的區別,且分別列出你知道的哪些語言屬於編譯型,哪些屬於解釋型。
2,執行 Python 指令碼的兩種方式是什麼
3,Pyhton 單行註釋和多行註釋分別用什麼?
4,布林值分別有什麼?
5,宣告變數注意事項有那些?
6,如何檢視變數在記憶體中的地址?
7,寫程式碼:
    1,實現使用者輸入使用者名稱和密碼,當用戶名為 seven 且 密碼為 123 時,顯示登陸成功,否則登陸失敗!
    2,實現使用者輸入使用者名稱和密碼,當用戶名為 seven 且 密碼為 123 時,顯示登陸成功,否則登陸失敗,失敗時允許重複輸入三次
    3,實現使用者輸入使用者名稱和密碼,當用戶名為 seven 或 alex 且 密碼為 123 時,顯示登陸成功,否則登陸失敗,失敗時允許重複輸入三次
8,寫程式碼
    a. 使用while迴圈實現輸出2-3+4-5+6...+100 的和
    b. 使用 while 迴圈實現輸出 1,2,3,4,5, 7,8,9, 11,12 使用 while 迴圈實現輸出 1-100 內的所有奇數

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

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

      n1 = 123456
      n2 = n1

2,作業:編寫登入介面

基礎需求:
1,讓使用者輸入使用者名稱密碼
2,認證成功後顯示歡迎資訊
3,輸錯三次後退出程式
dic = {
    'zixi1':{'password':'007','count':0},
    'zixi2':{'password':'007','count':0},
    'zixi3':{'password':'007','count':0},

}


while True:
    name = input('username>>: ')

    if not name in dic:
        print('使用者不存在')
        continue
    if dic[name]['count'] > 2:
        print('嘗試次數過多,鎖定')
        continue

    password = input('password>>: ')


    if password == dic[name]['password']:
        print('登入成功')
        break
    else:
        print('使用者名稱或密碼錯誤')
        dic[name]['count'] += 1
result

升級需求:
1,可以支援多個使用者登入(提示:通過列表存多個賬戶資訊)
2,使用者3次認證失敗後,退出程式,再次啟動程式嘗試登入時,還是鎖定狀態(提示:需要把使用者鎖定的狀態存到檔案裡)
# db.txt內容:zixi1|zixi2|
dic = {
    'zixi1':{'password':123,'count':0},
    'zixi2':{'password':123,'count':0},
    'zixi3':{'password':123,'count':0},
}

count = 0
while True:
    name = input('u>>: ')
    if name not in dic:
        print('使用者不存在')
        continue

    with open('db.txt','r') as f:
        lock_users = f.read().split('|')
        if name  in lock_users:
            print('使用者%s已經被鎖定' %name)
            break

    if dic[name]['count'] > 2:
        print('嘗試次數過多,鎖定')
        with open('db.txt','a') as f:
            f.write('%s|' % name)
        break

    password = int(input('p>>: '))

    if password == dic[name]["password"]:
        print('登入成功')
        break
    else:
        print('使用者名稱或密碼錯誤')
        dic[name]['count'] += 1
result