python學習筆記(一)

一 基本概念
1. 常量
動態語言,可在運行中隨時改變變量類型
可強制類型轉換
>>>a=1.8
>>>b=int(a)
>>>print b           #並不是四捨五入
1

2. 數
整數
長整數
浮點數
複數 0.0+0.0j 
互動作業:複數的使用和表示法
虛數不能單獨存在,它們總是和一個值爲 0.0 的實數部分一起來構成一個複數。
複數由實數部分和虛數部分構成
表示虛數的語法: real+imagj
實數部分和虛數部分都是浮點數
虛數部分必須有後綴j 或J。
eg:64.375+1j 4.23-8.5j 0.23-8.55j 1.23e-045+6.7e+089j
複數的內建屬性:
屬性 描述
num.real 該複數的實部
num num.imag 該複數的虛部
num.conjugate() 返回該複數的共軛複數

3. 字符串
單引號 ‘abc’
雙引號 “abc”
單引號和雙引號混合使用
>>>a='"abc"'
>>>print a
"abc"
三引號    '''abc'''     """abc"""
如果沒有對三引號進行復制操作如a="""abc""" 那麼它表示塊注視(JAVA中的//),三引號的另一種使用方式叫做文檔字符串(相當於JAVA中的方法註釋/*abc*/,JAVA中方法註釋可以生成API,python中help展現出的文字就是用文檔字符串註釋的)
轉義符 \
和其他語言相同
>>>a="abc\ndef"
>>>print a
abc
def
原生字符串 r”hello world!\n”
正則表達式中使用較多
>>> a=r"hello shit!\n"
>>> print a
hello shit!\n
處理中文前面帶u(表示unicode 一個漢字佔兩字節)
關於python中文處理詳細知識可參考下面兩個帖子
http://hi.baidu.com/gylxue/item/b25381174beff1fe746a8405  
 字符串是特殊的列表,關於索引 切片 增刪等在列表中做詳細講解
>>> a="123456"
>>> b="_".join(a)
>>> print b
1_2_3_4_5_6
常用的索引相關操作
切割操作
邪惡的eval()   eval/I`vael/ 重新運算求出參數的內容
>>> a='1+1'
>>> eval(a)
2
>>> type(eval(a))
<type 'int'>
>>>
>>> b='"1"+"1"'
>>> eval(b)
'11'
>>> b='"1"+"2"'
>>> eval(b)
'12'
>>> type(eval(b))
<type 'str'>
 對於eval的理解:將最終結果扒了層皮,如a='1+1' 先計算內部值a='2' 然後扒皮a就成整數2了。再如a='1'*5,先計算a='11111',後扒皮a=整數11111,eval(eval('"1"')) 扒了兩次皮最終結果依然是整數1。理解含義就是修煉獨孤九劍。


4. 變量
首字符爲字母(大小寫均可)或爲下劃線(_)
其他部分字符爲字母(大小寫均可)、數字、下劃線
區分大小寫,myname與myName是兩個不同的變量
Python 與大多數其它語言一樣有局部變量和全局變量之分,但是它沒有明顯的變量聲明。變量通過首次賦值產生,當超出作用範圍時自動消亡。

5. 數據類型
根據數據結構劃分:線性表,鏈表,哈希表。對應的:線性容器(數組,ArrayList),鏈式容器(LinkedList[這貨比較牛逼可以當作棧,隊列,雙向隊列來使用]),hash容器(hashmap,hashset,hashtable)
數值
字符串
線性容器
線性容器的特點:可以通過index訪問其元素的容器,因此String也是特殊的線性容器,只不過這個容器中的每個元素是一個字符類型(char)。
– 字符串
– List(列表)
eg:  tag = [1,2,3,4,5,6,7,8,9]
– tuple(元組)
eg:  tag = ('robots', 77, 93, 'try')
列表和元組的區別是列表可修改,元組不能修改,列表就像JAVA中的ArrayList,元組就像JAVA中的數組(一旦定義大小不可改變),需要注意的是這裏的元組不變性指的是元組本身,元組中的元素是可以改變的。
關於列表和元組的更多內容參考http://codingnow.cn/python/325.html
Hash容器
hash容器的數據結構是哈希表。hash就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。簡單的說就是用來確定元素唯一性的(所以JAVA中我們在比較對象時要重寫hashcode方法),比如下面的Dict字典(字典的Key必須是唯一的,像JAVA中的Hashmap),set集合(set集合中的元素必須是唯一的,像JAVA中的Hashset,TreeSet)。要注意的是:hashcode不同值一定不同,hashcode相同值不一定相同.
eg:  tag = {'host': 'earth'}
– Dict(字典)
– set(set集合)
None
類似於JAVA中的NULL,當變量爲None類型時只是聲明瞭變量並沒有分配內存空間。對於Python在內存的分配後面得好好看看,這裏猜測下應該是在棧裏面聲明瞭變量名,並沒有在堆中分配內存大小。
邏輯類型(True, False)
python中非0都是true

6. 邏輯行與物理行
什麼叫邏輯概念和物理概念
邏輯概念比物理概念更抽象些,就如Python的邏輯行表示的是PVM的編譯行,物理行是我們代碼的真實行。那麼由此可以理解高級語言就是物理概念,機器語言就是邏輯概念,我們的每個操作,每個變量都將變成機器識別的0 1串。這個0 1串是有規律的(或者說是有邏輯的),只有有規律的東西機器才能識別(由此可想機器永遠不會變的和人一樣有思維,因爲人的思維是無規律的,機器做不出無規律的程序,好吧YY了)。再看數據結構,元組是真實存在的,我們可以操作它,因此它是一個物理概念。序列是一個定義,它是抽象的。我們不能說創建一個序列。那麼序列就是一個邏輯概念。但是我們都知道元組就是一個序列。由此可見:物理概念是邏輯概念的具體表現形式,是客觀存在的。邏輯概念是物理概念的抽象定義,是主觀存在的。

7. 縮進
同意層次的語句必須有相同的縮進
不要混合使用空白和製表符,這樣在不同平臺中將無法工作。
強烈建議在縮進時,使用單個製表符或兩個或四個空格(wing ide中tab默認8個空格,修改:Editor-Indentation)

2) 運算符與表達式
1. 運算符
2. 運算符的優先級
-(常量,變量,函數,對象)+運算符+優先級
python是一個更精粹的面嚮對象語言,除了運算符全是對象。
3. 表達式
互動作業:表達式在計算機中是如何展開的
4. repr()
互動作業:repr()的使用
首先repr是reprensent的縮寫,它的意思是表現.repr()和str()方法很像(repr()的使用等價於反引號``),這兩個函數接受一個對象作爲其參數,返回適當的字符串。可以方便地以字符串的方式獲取對象的內容、類型、數值屬性等信息。str()函數得到的字符串可讀性好,而repr()函數得到的字符串通常可以用來重新獲得該對象,通常情況下obj==eval(repr(obj)) 這個等式是成立的(回想之前的eval使用:將返回結果扒層皮,repr()返回的是解釋器識別的字符串,字符串繼承於obj,所以字符串再扒皮不就獲得了它的原始對象了。(注意:並不是所有repr()返回的字符串都能夠用 eval()內建函數得到原來的對象。)那麼我可以理解repr()方法就是給對象穿一層string皮,這和eval恰恰相反)。

3) 邏輯控制結構
if
>>>a=1
>>>if a==1:
            print 1
        elif a==2:
            print 2
        else:
            print 3
1
for
>>> for x in range(10):
        print x,
0 1 2 3 4 5 6 7 8 9
>>> 
>>> a=('f',1,2,3,'3')
>>> for x in a:
        print x,
f 1 2 3 3
>>>
關於for循環的尾巴else:即在for 循環中,如果沒有從任何一個break中退出,則會執行和for對應的else只要從break中退出了,則else部分不執行。//注:加逗號不換行
>>> for i in range(0,10):
              if i > 5:
                 break;
         else:
              print "hello world";    #break退出這句不會執行
while
>>>a=1
>>>while a<100:
               print a
               a+=1
       else :
               print 'over'
>>>
while循環的尾巴else用法和for循環的else相同
break
continue
注意:python中沒有i++ i--

4) 函數
Python中函數表現形式
>>>def fun(a="a",b=2,c=3):
              """my first function"""
              print "a=%s"%a    #%s代表字符串
              print "b=%d"%b    #%d代表整數
              print  "c=",c     #顯示出來是:c= 3 多個空格
              return c,b+c     #可以返回多個返回值,如果用一個變量接收多個返回值,返回的將是一個元組

lambda表達式
>>> f1=lambda x,y:x+y
>>> print f1(1,2)
3
>>> 

閉包
>>>def fun1(x):
              def fun2(y):
                     return x+y
              return fun2       
>>>q=fun1(8)
>>>print q(100)
108
python中函數必須有名字,要想使用匿名函數則需要使用lambda函數
>>>def fun1(x):
              return lambda y:x+y       
>>>q=fun1(8)
>>>print q(100)
108
對於閉包可以理解爲對象內部包含對象,內部的對象是外部對象的一個屬性。JAVA中閉包是通過接口+內部類實現的閉包允許你將一些行爲封裝,將它像一個對象一樣傳來遞去,而且它依然能夠訪問到原來第一次聲明時的上下文。

5) 面向對象編程
變量:
1. 前帶_的變量: 標明是一個私有變量, 只用於標明, 外部類還是可以訪問到這個變量
2. 前帶兩個_ ,後帶兩個_ 的變量: 標明是內置變量,
3. 大寫加下劃線的變量: 標明是 不會發生改變的全局變量
函數:
1. 前帶_的變量: 標明是一個私有函數, 只用於標明,
2. 前帶兩個_ ,後帶兩個_ 的函數: 標明是特殊函數
class a:
      def __init__(self):                  #__init__是a類的構造函數,這裏是無參構造函數。
            self.m=1                   
      def add(self):                       #self的使用有點像JAVA中this的感覺
            self.p=2
            print self.m+self.p
      def __nn_(self):                     #這是專有函數 子類不能調用
            print 'ee'    
        
class b(a):                                   #b(a) 表示b繼承於a 
      def __init__(self):
            a.__init__(self)                 #這裏必須顯性的調用a類的構造方法(因爲我們重寫了a類的構造器)
            self.n=2
      def sum(self):
            print self.m+self.n
      def __dd(self):                      #這是私有函數 不能直接通過類的實例對象去調用
            print 'dd'
        
class UserProfile(object):          
      def __init__(self, profile):      #這是有參構造方法
            self._profile = profile     #_profile表示私有變量,只是表示外部類還是可以訪問到這個變量
      def profile(self):
             return self._profile+1
>>>user=UserProfile(10)
>>>print user.profile()
6) 異常處理
>>>def fuc():
              try:
                   fucc()
              except Exception,e:    #except相當於JAVA中的catch, Exception是一個類,它的實例我們起名叫e
                   print e.message 
>>>fuc()  
global name 'fucc' is not defined

防禦式編程
對於防禦式編程來說異常處理只是其中一種方案,它更應該是一種編程思想,一種編程習慣。我們來看下《代碼大全》中這些話。
想到四個字---學無止盡。對於工作中的防禦式編程,最深的體會應該是,NullpointExcetion了,我在調用對象方式時已經下意識的去考慮對象是否可能爲空。

7) 模塊與包
在組織模塊與包的時候文件夾下面必須有一個__init__.py文件,來告訴編譯器這個文件夾是一個模塊
我們可以打開自己的python安裝目錄下Lib目錄查看其中文件夾,發現每個文件夾中都包含這文件。
__init__.py文件另一個作用是:可以在該文件中寫入事件,一旦這個包被import就會觸發這個事件(好強大,似乎可以寫木馬)
當我們在eclipse中編程時,如果給一個文件夾中新建一個__init__.py文件 那麼這個文件夾的圖標就會變成一個package圖標

指定編碼格式:#coding=utf-8(或者 # -*- coding: UTF-8-*- )    //注意將文件另存爲utf-8的格式
指定編輯器版本:#!/usr/bin/python2.7 

8) 輸入、輸出、文件和目錄操作
os.walk()返回一個三元素的tuple:當前路徑、子文件夾名稱、文件列表。
Os.listdir()返回指定路徑下的所以文件和文件夾

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章