day01 - Python基礎1

目錄 html

 1 Python介紹
 2 Python發展史
 3 Python 2.x 與 3.x 的選擇
 4 Python 的安裝
 5 Hello World 程序的書寫語法
 6 變量
 7 用戶輸入
 8 模塊初識
 9 .pyc是個什麼鬼?
10 數據類型初識
11 數據運算
12 表達式if ...else語句
13 表達式for 循環
14 break and continue 
15 表達式while 循環
16 做業需求
17 補充:
18     bytes類型
19     三元運算
20     進制
目錄

 

 1、Python 介紹                                                                                                                                                                     

python的創始人爲吉多·範羅蘇姆(Guido van Rossum)。1989年的聖誕節期間,吉多·範羅蘇姆爲了在阿姆斯特丹的家中打發時間,java

決心開發一個新的腳本解釋程序,做爲ABC語言的一種繼承。python

最新(截止2017年3月)的TIOBE排行榜,Python趕超PHP佔據第五, Python崇尚優美、清晰、簡單,是一個優秀並普遍使用的語言。linux

由上圖可見,Python總體呈上升趨勢,反映出Python應用愈來愈普遍而且也逐漸獲得業內的承認!!!c++

目前Python主要應用領域:程序員

  • 雲計算: 雲計算應用最火的語言, 典型應用OpenStack
  • WEB開發: 擁有衆多優秀的WEB框架,許多的中大型網站均採用Python開發,Youtube, Dropbox, 豆瓣等, 典型WEB框架有Django。
  • 科學運算、人工智能: 典型庫NumPy, SciPy, Matplotlib, Enthought librarys,pandas
  • 系統運維: 運維人員必備語言
  • 金融:量化交易,金融分析。在金融工程領域,Python應用最廣,且重要性逐年提升。緣由:做爲動態語言的Python,語言結構清晰簡單,庫豐富,成熟穩定,科學計算和統計分析都很牛逼,生產效率遠遠高於c,c++,java,尤爲擅長策略回測。
  • 圖形GUI: PyQT, WxPython,TkInter

Python在一些公司的應用: web

  • 谷歌: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完成各類各樣的任務。

     Python的語言特性                                            

目前,在計算機領域的編程語言中,有多個角度來劃分的歸屬即低級與高級編譯型與解釋型靜態型與動態型強類型與弱類型面向過程與面向對象幾個方面來定性語言。算法

低級與高級:shell

 1 通常來說高級語言和低級語言有如下特色:
 2 
 3 高級語言:編程效率高,執行效率低,對硬件的可控性弱,目標代碼大,可維護性好,可移植性好(C語言等)
 4 低級語言:編程效率低,執行效率高,對硬件的可控性強,目標代碼小,可維護性差,可移植性差(彙編語言)
 5 
 6 
 7 咱們都知道CPU運行的是二進制指令,全部的語言編寫的程序最終都要翻譯成二進制代碼,可是爲何實現會有以上衆多差別呢?
 8 
 9 越低級的語言,形式上越接近機器指令,彙編指令與機器指令一一對應。而越高級的語言,一條語句對應的指令數越多,其緣由爲高級語言對底層操做進行了抽象和封裝,使編寫程序的過程更接近天然語言的邏輯表達,極大的簡化了編程的過程。也就是說當你用高級語言寫一句,會被轉換成許多底層操做,而這一轉換過程由編譯器或解釋器來完成,大大的提升了生產效率。所以高級語言的出現是計算機發展的必然結果。
10 
11 下面重點解釋爲什麼低級語言的執行效率更高:
12 
13 1.低級語言能夠經過控制硬件訪問來優化效率
14 
15 越低級的語言越接近底層,即控制硬件訪問的能力越強,對硬件資源的利用效率越高。好比說彙編語言可以訪問寄存器,而C語言就作不到。經過對寄存器等硬件的訪問,咱們能夠將程序的運行效率優化到最大,而像C這樣的高級語言用的最多的是堆棧這樣的內存結構,訪問速度天然不如寄存器了。
16 
17 2.高級語言程序存在工做冗餘,有效率損失。
18 
19 各類語言須要經過編譯器翻譯成機器碼,無論編譯多麼智能和強大,都會產生冗餘。這裏的冗餘不是指指令的多少,而是指有沒有必要作的操做。 產生冗餘的多少關鍵要看語言跟機器指令之間的耦合度。耦合度越大,編譯器翻譯過程越簡單,產生的冗餘越少。例如彙編程序,因爲與機器碼一一對應,所以編譯後基本沒有冗餘。而高級語言因爲進行了抽象和封裝,所以與機器指令間的耦合度相對較低,整個編譯過程相對複雜,不可避免地會產生較多的冗餘。聽說C語言有10%的效率損失。
20 
21 3.效率高不高,還取決於程序員水平。
22 
23 一個差的程序員用匯編寫程序,可能存在許多冗餘操做,而程序高手用c語言寫,能夠將程序優化到最大。最終的結果多是彙編的程序跑不過C語言程序。
24 
25 
26 總之,完成一項工做的工做量是不變的,機器作的 多了,人就作的就少了,同時人對程序的不少細節的控制性也減弱了。各類語言都是在這個平衡點附近糾結。從C/C++的注重機器運算效率的優化,到C#/Java注重開發效率的優化。人操做起來更加方便了,更高效了,代價就是,機器要處理的東西更多了,運算效率被進一步壓縮。可是壓縮在許可範圍內,就是一種進步。
低級與高級的優劣

 編譯型與解釋型:編程

   參考:

           關於計算機編程語言——編譯型和解釋型_2

           關於計算機編程語言——編譯型和解釋型【轉】

靜態型與動態型:

一般咱們所說的動態語言、靜態語言是指動態類型語言和靜態類型語言。

(1)動態類型語言:動態類型語言是指在運行期間纔去作數據類型檢查的語言,也就是說,在用動態類型的語言編程時,不用給變量指定數據類型,程序運行時會在首次賦值給變量時,在內部將該變量的數據類型記錄下來。Python和Ruby就是一種典型的動態類型語言,其餘的各類腳本語言如 VBScript,Shell等屬於動態類型語言。

(2)靜態類型語言:靜態類型語言與動態類型語言恰好相反,變量的數據類型是在編譯期間檢查的,也就是說在給變量賦值以前必須首先聲明變量的數據類型,C/C++是靜態類型語言的典型表明,其餘的靜態類型語言還有C#、JAVA等。

對於動態語言與靜態語言的區分,套用一句流行的話就是:Static typing when possible, dynamic typing when needed。
靜態型與動態型

 強類型與弱類型:

1)強類型語言:強制數據類型定義的語言。也就是說,一旦一個變量被指定了某個數據類型,若是不通過強制類型轉換,那麼它就永遠是這個數據類型。舉個例子:若是你定義了一個整型變量a,那麼程序根本不可能將a看成字符串類型處理。強類型定義語言是類型安全的語言。

(2)弱類型語言:數據類型能夠被忽略的語言。它與強類型定義語言相反, 一個變量能夠賦不一樣數據類型的值。

雖然強類型定義語言在運行速度上可能略遜於弱類型定義語言,可是強類型定義語言帶來的嚴謹性可以有效的避免許多錯誤。另外,「這門語言是否是動態語言」與「這門語言是否類型安全」之間是徹底沒有聯繫的!
例如:Python是動態語言,是強類型定義語言(類型安全的語言); VBScript是動態語言,是弱類型定義語言(類型不安全的語言); JAVA是靜態語言,是強類型定義語言(類型安全的語言)。
強類型與弱類型

python是一門動態解釋性的強類型定義語言。那這些特性決定了Python的一些優缺點。

     Python的語言的優缺點                                           

先看優勢

  1. Python的定位是「優雅」、「明確」、「簡單」,因此Python程序看上去老是簡單易懂,初學者學Python,不但入門容易,並且未來深刻下去,能夠編寫那些很是很是複雜的程序。
  2. 開發效率很是高,Python有很是強大的第三方庫,基本上你想經過計算機實現任何功能,Python官方庫裏都有相應的模塊進行支持,直接下載調用後,在基礎庫的基礎上再進行開發,大大下降開發週期,避免重複造輪子。
  3. 高級語言————當你用Python語言編寫程序的時候,你無需考慮諸如如何管理你的程序使用的內存一類的底層細節。
  4. 可移植性————因爲它的開源本質,Python已經能夠被移植到許多平臺上(通過改動使它可以工做在不一樣平臺上)。若是你當心地避免使用依賴於系統的特性,那麼你的全部Python源程序無需修改就幾乎能夠在市場上全部的系統平臺上運行。
  5. 可擴展性————若是你須要你的一段關鍵代碼運行得更快或者但願某些算法不公開,你能夠把你的部分程序用C或C++編寫,而後在你的Python程序中使用它們。
  6. 可嵌入性————你能夠把Python嵌入你的C/C++程序,從而向你的程序用戶提供腳本功能。

 再看缺點:

  1. 運行速度慢,Python 的運行速度相比C語言確實慢不少,跟JAVA相比也要慢一些,所以這也是不少所謂的大牛不屑於使用Python的主要緣由;可是在大多數狀況下,這裏所指的運行速度慢用戶是沒法直接感知到的,必須藉助測試工具才能體現出來,好比你用C運一個程序花了0.01s,用Python是0.1s,這樣C語言直接比Python快了10倍,算是很是誇張了,可是你是沒法直接經過肉眼感知的,由於一個正常人所能感知的時間最小單位是0.15-0.4s左右,哈哈。其實在大多數狀況下Python已經徹底能夠知足你對程序速度的要求,除非你要寫對速度要求極高的搜索引擎等,這種狀況下,固然仍是建議你用C去實現的。
  2. 代碼不能加密,由於Python是解釋性語言,它的源碼都是以明文形式存放的,不過我不認爲這算是一個缺點,若是你的項目要求源代碼必須是加密的,那你一開始就不該該用Python來去實現。
  3. 線程不能利用多CPU問題,這是Python被人詬病最多的一個缺點,GIL即全局解釋器鎖(Global Interpreter Lock),是計算機程序設計語言解釋器用於同步線程的工具,使得任什麼時候刻僅有一個線程在執行,Python的線程是操做系統的原生線程。在Linux上爲pthread,在Windows上爲Win thread,徹底由操做系統調度線程的執行。一個python解釋器進程內有一條主線程,以及多條用戶程序的執行線程。因爲GIL的存在,即便在多核CPU平臺上,也不能實現多線程的並行執行。關於這個問題的折衷解決方法,咱們在之後線程和進程章節裏再進行詳細探討。

          固然,Python還有一些其它的小缺點,在這就不一一列舉了,我想說的是,任何一門語言都不是完美的,都有擅長和不擅長作的事情。

     Python的解釋器                            

當咱們編寫Python代碼時,咱們獲得的是一個包含Python代碼的以.py爲擴展名的文本文件。要運行代碼,就須要Python解釋器去執行.py文件。

因爲整個Python語言從規範到解釋器都是開源的,因此理論上,只要水平夠高,任何人均可以編寫Python解釋器來執行Python代碼(固然難度很大)。事實上,確實存在多種Python解釋器。

CPython

當咱們從Python官方網站下載並安裝好Python 2.7後,咱們就直接得到了一個官方版本的解釋器:CPython。這個解釋器是用C語言開發的,因此叫CPython。在命令行下運行python就是啓動CPython解釋器。

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的字節碼。

      小結                             

Python的解釋器不少,但使用最普遍的仍是CPython。若是要和Java或.Net平臺交互,最好的辦法不是用Jython或IronPython,而是經過網絡調用來交互,確保各程序之間的獨立性。

 

 2、Python 發展史                                                                                                                                                                  

  • 1989年,爲了打發聖誕節假期,Guido開始寫Python語言的編譯器。Python這個名字,來自Guido所摯愛的電視劇Monty Python’s Flying Circus。他但願這個新的叫作Python的語言,能符合他的理想:創造一種C和shell之間,功能全面,易學易用,可拓展的語言。
  • 1991年,第一個Python編譯器誕生。它是用C語言實現的,並可以調用C語言的庫文件。自誕生之日起,Python已經具備了:類,函數,異常處理,包含表和詞典在內的核心數據類型,以及模塊爲基礎的拓展系統。
  • Granddaddy of Python web frameworks, Zope 1 was released in 1999
  • Python 1.0 - January 1994 增長了 lambdamapfilter 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
  • 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

 

 3、Python 2.x 與 3.x 的選擇                                                                                                                                                  

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). 

py2與3的詳細區別

PRINT IS A FUNCTION

The statement has been replaced with a print() function, with keyword arguments to replace most of the special syntax of the old statement (PEP 3105). Examples:

1 Old: print "The answer is", 2*2 New: print("The answer is", 2*2)
2 Old: print x, # Trailing comma suppresses newline New: print(x, end=" ") # Appends a space instead of a newline
3 Old: print # Prints a newline
4 New: print() # You must call the function!
5 Old: print >>sys.stderr, "fatal error" New: print("fatal error", file=sys.stderr)
6 Old: print (x, y) # prints repr((x, y))
7 New: print((x, y)) # Not the same as print(x, y)!

You can also customize the separator between items, e.g.:

1 print("There are <", 2**32, "> possibilities!", sep="")

ALL IS UNICODE NOW(Python3.x)
今後再也不爲討厭的字符編碼而煩惱

還能夠這樣玩: (A,*REST,B)=RANGE(5)

1 <strong>>>> a,*rest,b = range(5)
2 >>> a,rest,b
3 (0, [1, 2, 3], 4)
4 </strong>

某些庫更名了

Old Name New Name
SocketServer socketserver
markupbase _markupbase
repr reprlib
test.test_support test.support
_winreg winreg
ConfigParser configparser
copy_reg copyreg
Queue queue

 

 

 

 

 

                                                                                                                                                    

 

 

還有誰不支持PYTHON3?

One popular module that don't yet support Python 3 is Twisted (for networking and other applications). Most actively maintained libraries have people working on 3.x support. For some libraries, it's more of a priority than others: Twisted, for example, is mostly focused on production servers, where supporting older versions of Python is important, let alone supporting a new version that includes major changes to the language. (Twisted is a prime example of a major package where porting to 3.x is far from trivial).

 

4、Python 的安裝                                                                                                                                                                   

 windows

一、下載安裝包
    https://www.python.org/downloads/
二、安裝
    默認安裝路徑:C:\python27
三、配置環境變量
    【右鍵計算機】--》【屬性】--》【高級系統設置】--》【高級】--》【環境變量】--》【在第二個內容框中找到 變量名爲Path 的一行,雙擊】 
-->【Python安裝目錄追加到變值值中,用 ; 分割】 如:原來的值;C:\python27,切記前面有分號.

 linux、Mac

   無需安裝,原裝Python環境若是自帶 2.6 ,請更新至 2.7

 

5、Hello World 程序的書寫語法                                                                                                                                              

在Linux下建立一個名爲hello.py的文件,並輸入

 1 print("Hello World!") 

而後執行命令:python hello.py ,輸出

1 localhost:~ jieli$ vim hello.py
2 localhost:~ jieli$ python hello.py
3 Hello World!

指定解釋器

上一步中執行 python hello.py 時,明確的指出 hello.py 腳本由 python 解釋器來執行。

若是想要相似於執行shell腳本同樣執行python腳本,例: ./hello.py ,那麼就須要在 hello.py 文件的頭部指定解釋器,以下:

1 #!/usr/bin/env python
2   
3 print "hello,world"

如此一來,執行: ./hello.py 便可。

ps:執行前需給予 hello.py 執行權限,chmod 755 hello.py

在交互器中執行 

除了把程序寫在文件裏,還能夠直接調用python自帶的交互器運行代碼。

1 localhost:~ jieli$ python
2 Python 2.7.10 (default, Oct 23 2015, 18:05:06)
3 [GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
4 Type "help", "copyright", "credits" or "license" for more information.
5 >>> print("Hello World!")
6 Hello World!

 

6、 變量                                                                                                                                                                                  

 Variables are used to store information to be referenced and manipulated in a computer program. They also provide a way of labeling data with a descriptive name, so our programs can be understood more clearly by the reader and ourselves. It is helpful to think of variables as containers that hold information. Their sole purpose is to label and store data in memory. This data can then be used throughout your program.

聲明變量並賦值

1 #-*-coding:utf-8-*-
2  
3 name = "Ant Colonies"

上述代碼聲明瞭一個變量,變量名爲: name,變量name的值爲:"Ant Colonies" 

變量定義的規則:

  • 變量名只能是 字母、數字或下劃線的任意組合
  • 變量名的第一個字符不能是數字
  • 如下關鍵字不能聲明爲變量名
    ['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']

7、 用戶輸入                                                                                                                                                                            

 python解釋器在加載 .py 文件中的代碼時,會對內容進行編碼(默認ascill)

ASCII(American Standard Code for Information Interchange,美國標準信息交換代碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其餘西歐語言,其最多隻能用 8 位來表示(一個字節),即:2**8 = 256-1,因此,ASCII碼最多隻能表示 255 個符號。

關於中文

爲了處理漢字,程序員設計了用於簡體中文的GB2312和用於繁體中文的big5。

GB2312(1980年)一共收錄了7445個字符,包括6763個漢字和682個其它符號。漢字區的內碼範圍高字節從B0-F7,低字節從A1-FE,佔用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。

GB2312 支持的漢字太少。1995年的漢字擴展規範GBK1.0收錄了21886個符號,它分爲漢字區和圖形符號區。漢字區包括21003個字符。2000年的 GB18030是取代GBK1.0的正式國家標準。該標準收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。如今的PC平臺必須支持GB18030,對嵌入式產品暫不做要求。因此手機、MP3通常只支持GB2312。

從ASCII、GB23十二、GBK 到GB18030,這些編碼方法是向下兼容的,即同一個字符在這些方案中老是有相同的編碼,後面的標準支持更多的字符。在這些編碼中,英文和中文能夠統一地處理。區分中文編碼的方法是高字節的最高位不爲0。按照程序員的稱呼,GB23十二、GBK到GB18030都屬於雙字節字符集 (DBCS)。

有的中文Windows的缺省內碼仍是GBK,能夠經過GB18030升級包升級到GB18030。不過GB18030相對GBK增長的字符,普通人是很難用到的,一般咱們仍是用GBK指代中文Windows內碼。

顯然ASCII碼沒法將世界上的各類文字和符號所有表示,因此,就須要新出一種能夠表明全部字符和符號的編碼,即:Unicode

Unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字符編碼。Unicode 是爲了解決傳統的字符編碼方案的侷限而產生的,它爲每種語言中的每一個字符設定了統一而且惟一的二進制編碼,規定雖有的字符和符號最少由 16 位來表示(2個字節),即:2 **16 = 65536,
注:此處說的的是最少2個字節,可能更多

UTF-8,是對Unicode編碼的壓縮和優化,他再也不使用最少使用2個字節,而是將全部的字符和符號進行分類:ascii碼中的內容用1個字節保存、歐洲的字符用2個字節保存,東亞的字符用3個字節保存...

因此,python解釋器在加載 .py 文件中的代碼時,會對內容進行編碼(默認ascill),若是是以下代碼的話:

報錯:ascii碼沒法表示中文

1 #!/usr/bin/env python
2   
3 print "你好,世界"

改正:應該顯示的告訴python解釋器,用什麼編碼來執行源代碼,即:

1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3   
4 print "你好,世界"

     註釋                                                  

當行注視:# 被註釋內容

多行註釋:""" 被註釋內容 """

              ''' 被註釋內容 '''

       用戶輸入                                                 

1 #!/usr/bin/env python
2 #_*_coding:utf-8_*_ 
3  
4 #name = raw_input("What is your name?") #only on python 2.x
5 name = input("What is your name?")
6 print("Hello " + name )
raw_input

 輸入密碼時,若是想要不可見,須要利用getpass 模塊中的 getpass方法,即:

 1 #!/usr/bin/evn python
 2 # -*- coding:utf-8 -*-
 3 # Author: antcolonies
 4 
 5 import getpass
 6 
 7 _username = 'Bluce Li'
 8 _passwd = 'abcde4'
 9 username = input('username:')
10 passwd = getpass.getpass('passwd:')  # 隱藏輸入的密碼
11 
12 # print(username,passwd)    # 在Windows的cmd中演示
13 
14 if _username == username and _passwd == passwd:
15     print("Welcome user {name} log in".format(name=username))
16 else:
17     print('Invalid username or passwd!')
交互界面隱藏待輸入的密碼

 

8、 模塊初識                                                                                                                                                                            

 Python的強大之處在於他有很是豐富和強大的標準庫和第三方庫,幾乎你想實現的任何功能都有相應的Python庫支持,之後的課程中會深刻講解經常使用到的各類庫。

#!/usr/bin/evn python
# -*- coding:utf-8 -*-
# Author: antcolonies

import sys

# print(sys.path)    # 打印環境變量
# 如下是環境變量的打印
''' 執行程序查找模塊順序:先當前路徑,後環境變量(D:\\Python是Python在win7上的安裝路徑)
['E:\\python14_workspace\\s14\\day01',
 'E:\\python14_workspace\\s14',
 'C:\\Windows\\system32\\python34.zip',
 'D:\\Python\\DLLs',
 'D:\\Python\\lib',           標準庫位置
 'D:\\Python',
 'D:\\Python\\lib\\site-packages']     第三方庫位置
'''

'''
print(sys.argv)
print(sys.argv[3])      # sys.argv爲一list對象
'''
# pycharm中默認是絕對路徑
# ['E:/python14_workspace/s14/day01/sys_mod.py']

'''     在系統上運行時(打印的是本文件的相對路徑)
E:\python14_workspace\s14\day01>python sys_mod.py
['sys_mod.py']

E:\python14_workspace\s14\day01>python sys_mod.py 'hello' 'python' 'world'
['sys_mod.py', 'hello', 'python', 'python']   爲一list數據結構
'''

'''
import os            # 與系統交互的模塊

# cmd_res = os.system("dir")  # cmd_res 爲命令dir執行的返回碼
                              # 打印輸出在屏幕,未重定向,還存在亂碼
cmd_res = os.popen("dir")     # <os._wrap_close object at 0x00000000021DE0B8>
                              # os._wrap_close object 存放於內存0x00000000021DE0B8中
cmd_res = os.popen("dir").read()    # 該對象的read()方法將dir命令調用系統返回的結果從內存
                                    # 中讀出並打印且不存在亂碼
print('=======',cmd_res)

os.mkdir("new_dir")      # 建立目錄
'''

import login        # 導入自定義模塊
'''
login模塊對應的文件login.py與本文件路徑相同時正常執行,一旦將
將login.py移動到其餘路徑,Python就沒法找到模塊對應的文件,出
現如下錯誤(將文件移動到系統路徑/python/lib/site-packages下
便可糾正錯誤)
D:\Python\python.exe E:/python14_workspace/s14/day01/sys_mod.py
Traceback (most recent call last):
  File "E:/python14_workspace/s14/day01/sys_mod.py", line 46, in <module>
    import login
ImportError: No module named 'login'
'''
import os/sys

 

9、 .pyc是個什麼鬼?                                                                                                                                                               

 1. Python是一門解釋型語言?

我初學Python時,聽到的關於Python的第一句話就是,Python是一門解釋性語言,我就這樣一直相信下去,直到發現了*.pyc文件的存在。若是是解釋型語言,那麼生成的*.pyc文件是什麼呢?c應該是compiled的縮寫纔對啊!

爲了防止其餘學習Python的人也被這句話誤解,那麼咱們就在文中來澄清下這個問題,而且把一些基礎概念給理清。

  

2. 解釋型語言和編譯型語言 

計算機是不可以識別高級語言的,因此當咱們運行一個高級語言程序的時候,就須要一個「翻譯機」來從事把高級語言轉變成計算機能讀懂的機器語言的過程。這個過程分紅兩類,第一種是編譯,第二種是解釋。

編譯型語言在程序執行以前,先會經過編譯器對程序執行一個編譯的過程,把程序轉變成機器語言。運行時就不須要翻譯,而直接執行就能夠了。最典型的例子就是C語言。

解釋型語言就沒有這個編譯的過程,而是在程序運行的時候,經過解釋器對程序逐行做出解釋,而後直接運行,最典型的例子是Ruby。

經過以上的例子,咱們能夠來總結一下解釋型語言和編譯型語言的優缺點,由於編譯型語言在程序運行以前就已經對程序作出了「翻譯」,因此在運行時就少掉了「翻譯」的過程,因此效率比較高。可是咱們也不能一律而論,一些解釋型語言也能夠經過解釋器的優化來在對程序作出翻譯時對整個程序作出優化,從而在效率上不斷接近編譯型語言。

此外,隨着Java等基於虛擬機的語言的興起,咱們又不能把語言純粹地分紅解釋型和編譯型這兩種。

用Java來舉例,Java首先是經過編譯器編譯成字節碼文件(.class文件),而後在運行時經過解釋器給解釋成機器(二進制)文件。因此咱們說Java是一種先編譯後解釋的語言。

 

3. Python究竟是什麼 

其實Python和Java/C#同樣,也是一門基於虛擬機的語言,咱們先來從表面上簡單地瞭解一下Python程序的運行過程吧。

當咱們在命令行中輸入python hello.py時,實際上是激活了Python的「解釋器」,告訴「解釋器」:你要開始工做了。但是在「解釋」以前,其實執行的第一項工做和Java同樣,是編譯。

熟悉Java的同窗能夠想一下咱們在命令行中如何執行一個Java的程序:

javac hello.java

java hello

 

只是咱們在用Eclipse之類的IDE時,將這兩部給融合成了一部而已。其實Python也同樣,當咱們執行python hello.py時,他也同樣執行了這麼一個過程,因此咱們應該這樣來描述Python,Python是一門先編譯後解釋的語言。

4. 簡述Python的運行過程

在說這個問題以前,咱們先來講兩個概念,PyCodeObject和pyc文件。

咱們在硬盤上看到的pyc天然沒必要多說,而其實PyCodeObject則是Python編譯器真正編譯成的結果。咱們先簡單知道就能夠了,繼續向下看。

當python程序運行時,編譯的結果則是保存在位於內存中的PyCodeObject中,當Python程序運行結束時,Python解釋器則將PyCodeObject寫回到pyc文件中。

當python程序第二次運行時,首先程序會在硬盤中尋找pyc文件,若是找到,則直接載入,不然就重複上面的過程。

因此咱們應該這樣來定位PyCodeObject和pyc文件,咱們說pyc文件實際上是PyCodeObject的一種持久化保存方式。

舉例來講 -------------

如下是login.py文件源碼:

 1 #!/usr/bin/evn python
 2 # -*- coding:utf-8 -*-
 3 # Author: antcolonies
 4 
 5 import getpass
 6 
 7 _username = 'ted'
 8 _passwd = '123456'
 9 
10 user = input('input username: ')
11 # pwd = getpass.getpass('input passwd: ')
12 pwd = input('input passwd: ')
13 
14 if user == _username and pwd == _passwd:
15     print('welcome user %s log in.'% user)
16 else:
17     print('wrong username or passwd.')
login.py

login.py運行後:

如下是login.cpython-34.pyc中的內容:

因而可知生成的.pyc文件「編譯」程度比較低級,還未達到Java編譯的字節碼文件的程度。

當源碼好比login.py源碼進行了修改,系統再次運行該模塊時,系統會對比login.py與login.cpython-34.pyc文件的時間戳,

若是源碼文件時間戳較大,那麼系統會從新「編譯」原文件。

 

10、 數據類型初識                                                                                                                                                                      

 一、數字

2 是一個整數的例子。
長整數 不過是大一些的整數。
3.23和52.3E-4是浮點數的例子。E標記表示10的冪。在這裏,52.3E-4表示52.3 * 10-4。
(-5+4j)和(2.3-4.6j)是複數的例子,其中-5,4爲實數,j爲虛數,數學中表示覆數是什麼?。

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也不會致使嚴重後果了。
float(浮點型)
     先掃盲 http://www.cnblogs.com/alex3714/articles/5895848.html
  浮點數用來處理實數,即帶有小數的數字。相似於C語言中的double類型,佔8個字節(64位),其中52位表示底,11位表示指數,剩下的一位表示符號。
complex(複數)
      複數由實數部分和虛數部分組成,通常形式爲x+yj,其中的x是複數的實數部分,y是複數的虛數部分,這裏的x和y都是實數。
注:Python中存在小數字池:-5 ~ 257
 
二、布爾值
  真或假
  1 或 0
三、字符串
"hello world"
萬惡的字符串拼接:
  python中的字符串在C語言中體現爲是一個字符數組,每次建立字符串時候須要在內存中開闢一塊連續的空,而且一旦須要修改字符串的話,就須要再次開闢空間,萬惡的+號每出現一次就會在內從中從新開闢一塊空間。

字符串格式化輸出

name = "alex"
print "i am %s " % name
  
#輸出: i am alex

 PS: 字符串是 %s;整數 %d;浮點數%f

字符串經常使用功能:
  • 移除空白
  • 分割
  • 長度
  • 索引
  • 切片
四、列表

建立列表:

name_list = ['alex', 'seven', 'eric']
或
name_list = list(['alex', 'seven', 'eric'])

 

基本操做:

  • 索引
  • 切片
  • 追加
  • 刪除
  • 長度
  • 切片
  • 循環
  • 包含
五、元組(不可變列表)
建立元組:
ages = (11, 22, 33, 44, 55)
或
ages = tuple((11, 22, 33, 44, 55))
六、字典(無序)
建立字典:
person = {"name": "mr.wu", 'age': 18}
或
person = dict({"name": "mr.wu", 'age': 18})

經常使用操做:

  • 索引
  • 新增
  • 刪除
  • 鍵、值、鍵值對
  • 循環
  • 長度

11、 數據運算                                                                                                                                                                         

 參考: http://www.runoob.com/python/python-operators.html

12、 表達式 if ...else 語句                                                                                                                                                       

 

 1 #!/usr/bin/evn python
 2 # -*- coding:utf-8 -*-
 3 # Author: antcolonies
 4 
 5 age_of_bluce = 28
 6 
 7 guess_age = int(input('guess age:'))
 8 if guess_age == age_of_bluce:
 9     print('bingo.')
10 elif guess_age > age_of_bluce:
11     print('bigger than the fact')
12 else:
13     print('smaller than the fact')

 

十3、 表達式for 循環                                                                                                                                                                

 

 1 #!/usr/bin/evn python
 2 # -*- coding:utf-8 -*-
 3 # Author: antcolonies
 4 
 5 age_of_bluce = 26
 6 
 7 for I in range(3):
 8     guess_age = int(input('guess age:'))
 9     if guess_age == age_of_bluce:
10         print('bingo.')
11         break
12     elif guess_age > age_of_bluce:
13         print('bigger than the fact')
14     else:
15         print('smaller than the fact')
16 else:    #(與for條件判斷同級別,當for的條件爲FALSE時執行,僅見於Python)
17     print('You have tried too many times..get hell out')

 

十4、 break and continue                                                                                                                                                       

 break 跳出當前循環並向下執行循環結構外的下一條語句;

 continue 從continue處跳轉至當前循環結構的首部並繼續下一輪循環;

十5、 表達式 while 循環                                                                                                                                                            

 

#!/usr/bin/evn python
# -*- coding:utf-8 -*-
# Author: antcolonies

age_of_bluce = 26
count = 0

while count < 3:
    guess_age = int(input('guess age:'))
    count += 1
    if guess_age == age_of_bluce:
        print('bingo.')
        break
    elif guess_age > age_of_bluce:
        print('bigger than the fact')
    else:
        print('smaller than the fact')
else:    #(與while條件判斷同級別,當while的條件爲FALSE時執行,僅見於Python)
    print('You have tried too many times..get hell out')

 

十6、 做業需求                                                                                            

 編寫登錄接口

  • 輸入用戶名密碼
  • 認證成功後顯示歡迎信息
  • 輸錯三次後鎖定
#!/usr/bin/evn python
# -*- coding:utf-8 -*-
# Author: antcolonies

def readFile(path, mode):
    dict1 = {}
    f = open(path, mode)
    lines = f.readlines()
    f.close()
    num = len(lines)
    if num > 0:
        for i in range(num):
            line = lines[i].strip()
            if len(line) != 0:
                line = line.split(' ')
                dict1[line[0]] = line[1]
    return dict1

def writeFile(path, record):
    f = open(path, 'a')
    f.write(record)
    f.close()

def existFile(path):
    f = open(path, 'a+')
    f.close()

PassWd = r'E:\python14_workspace\s14\day01\passwd.txt'
LoginLog = r'E:\python14_workspace\s14\day01\LoginLog.txt'
usrname = input("input username: ")

# 檢查文件是否存在,若不存在,則建立該文件
existFile(LoginLog)

dict1 = readFile(LoginLog,'r')
value = dict1.get(usrname)


if value != '':                         # 判斷該用戶是否被鎖定
    input('the user has been locked!\n')
else:
    dict2 = readFile(PassWd, 'r')
    value2 = dict2.get(usrname)
    if value2 == None:          # 判斷用戶是否已經註冊
        print('the user does not register!')
    else:
        passwd = input("input passwd: ")
        count = 1
        while count < 3:         # 限制密碼輸入次數不得大於3次
            if value2 == passwd:    # 登陸成功
                print('log in successful.')
                break
            print('the passwd you put is wrong, try it again.')
            passwd = input("input passwd: ")
            count += 1
        else:               # 將鎖定信息登記
            record = '%s %s\n'%(usrname, count)
            writeFile(LoginLog, record)
            input('you have input more than 3 times.\nthe user will be locked!')
LoginInterface

 

 

補充:

1、bytes類型

 The bytes/str dichotomy in Python 3 [transport]

 

2、三元運算

C語言或Java的三元條件表達式condition ? true_part : false_part,雖然Python沒有三目運算符(?:),但也有相似的替代方案,那就是result = true_part if condition else false_part.

若是條件爲真:result = true_part
若是條件爲假:result = false_part

 

3、進制

  • 二進制,01
  • 八進制,01234567
  • 十進制,0123456789
  • 十六進制,0123456789ABCDEF  二進制到16進制轉換http://jingyan.baidu.com/album/47a29f24292608c0142399cb.html?picindex=1

計算機內存地址和爲何用16進制?

爲何用16進制
一、計算機硬件是0101二進制的,16進制恰好是2的倍數,更容易表達一個命令或者數據。十六進制更簡短,由於換算的時候一位16進制數能夠頂4位2進制數,也就是一個字節(8位進制能夠用兩個16進製表示)
二、最先規定ASCII字符集採用的就是8bit(後期擴展了,可是基礎單位仍是8bit),8bit用2個16進制直接就能表達出來,無論閱讀仍是存儲都比其餘進制要方便
三、計算機中CPU運算也是遵守ASCII字符集,以1六、3二、64的這樣的方式在發展,所以數據交換的時候16進制也顯得更好
四、爲了統一規範,CPU、內存、硬盤咱們看到都是採用的16進制計算


16進制用在哪裏
一、網絡編程,數據交換的時候須要對字節進行解析都是一個byte一個byte的處理,1個byte能夠用0xFF兩個16進制來表達。經過網絡抓包,能夠看到數據是經過16進制傳輸的。
二、數據存儲,存儲到硬件中是0101的方式,存儲到系統中的表達方式都是byte方式

三、一些經常使用值的定義,好比:咱們常常用到的html中color表達,就是用的16進制方式,4個16進制位能夠表達好幾百萬的顏色信息。

相關文章
相關標籤/搜索