>>> 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中的數組(一旦定義大小不可改變),需要注意的是這裏的元組不變性指的是元組本身,元組中的元素是可以改變的。
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
>>>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) 輸入、輸出、文件和目錄操作