python深入(函數,文件操作)

一、內建函數

1、數學運算類

abs(x)#求絕對值

divmod(a, b)#分別取商和餘數

float([x])#將一個字符串或數轉換爲浮點數。如果無參數將返回0.0

int([x[, base]])#將一個字符轉換爲int類型,base表示進制

long([x[, base]])#將一個字符轉換爲long類型

range([start], stop[, step]) #產生一個序列,默認從0開始

oct(x)#將一個數字轉化爲8進制

hex(x)#將整數x轉換爲16進制字符串

chr(i)#返回整數i對應的ASCII字符

2、集合操作類

format(value [, format_spec])#格式化輸出字符串,如“I am {0},I like {1}”

iter(o[, sentinel])#生成一個對象的迭代器,第二個參數表示分隔符

max(iterable[, args...][key]) #返回集合中的最大值

min(iterable[, args...][key])#返回集合中的最小值

dict([arg])#創建數據字典

list([iterable]) #將一個集合類轉換爲另外一個集合類

str([object]) #轉換爲string類型

sorted(iterable[, cmp[, key[, reverse]]])#隊集合排序

xrange([start], stop[, step]) #返回一個xrange對象

3、邏輯判斷

all(iterable)#集合中的元素都爲真的時候爲真,若爲空串返回爲True

any(iterable)#集合中的元素有一個爲真的時候爲真,若爲空串返回爲False

cmp(x, y)#如果x < y ,返回負數;x == y, 返回0;x > y,返回正數

4、反射

hash(object)#如果對象object爲哈希表類型,返回對象object的哈希值

id(object)#返回對象的唯一標識

len(s) #返回集合長度

eload(module) #重新加載模塊

type(object)#返回該object的類型

5、io操作

input([prompt]) #獲取用戶輸入,使用raw_input該函數將不會捕獲用戶的錯誤輸入

file(filename [, mode [, bufsize]]) #

open(name[, mode[, buffering]]) 打開文件,推薦使用open

raw_input([prompt]) #設置輸入,輸入都是作爲字符串處理

二、文件操作

1、打開模式列表

#w      以寫方式打開,

#a      以追加模式打開 (從 EOF 開始, 必要時創建新文件)

#r+     以讀寫模式打開

#w+     以讀寫模式打開 (參見 w )

#a+     以讀寫模式打開 (參見 a )

#rb     以二進制讀模式打開

#wb     以二進制寫模式打開 (參見 w )

#ab     以二進制追加模式打開 (參見 a )

#rb+    以二進制讀寫模式打開 (參見 r+ )

#wb+    以二進制讀寫模式打開 (參見 w+ )

#ab+    以二進制讀寫模式打開 (參見 a+ )

#"U"表示在讀取時,可以將 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用)rU,r+U

2、文件對象方法

file.close()                     # 關閉文件

file.fileno()                    # 返回文件的描述符

file.flush()                     # 刷新文件的內部緩衝區

file.isatty()                    # 判斷file是否是一個類tty設備

file.next()                      # 返回文件的下一行,或在沒有其他行時引發StopIteration異常

file.read(size=-1)               # 從文件讀取size個字節,當未給定size或給定負值的時候,讀取剩餘的所有字節,然後作爲字符串返回

file.readline(size=-1)           # 從文件中讀取並返回一行(包括行結束符),或返回最大size個字符

file.readlines(sizhint=0)        # 讀取文件的所有行作爲一個列表返回

file.xreadlines()                # 用於迭代,可替換readlines()的一個更高效的方法

file.seek(off, whence=0)         # 在文件中移動文件指針,從whence(0代表文件起始,1代表當前位置,2代表文件末尾)偏移off字節

file.tell()                      # 返回當前在文件中的位置

file.truncate(size=file.tell())  # 截取文件到最大size字節,默認爲當前文件位置

file.write(str)                  # 向文件寫入字符串

file.writelines(seq)             # 向文件寫入字符串序列seq;seq應該是一個返回字符串的可迭代對象

3、文件讀取

f = open('tpm.txt')

# read方式讀取

s = f.read()

print(s, '\n\n\n')

print(f.tell())

#上面讀取完後指針移動到最後,通過seek將文件指針移動到文件頭

f.seek(0)

#使用readline每次讀取一行

while(True):

line = f.readline()

print(line)

if(len(line) == 0):

break

f.close()

#爲了避免打開文件後忘記關閉,可以通過管理上下文,即:

with open('log','r') as f:

with open('log1') as obj1, open('log2') as obj2:

    pass

二、函數

1、定義和使用函數

def 函數名(參數):

函數體

3、參數

形參:在定義函數的同時定義變量,如下例的a,b。

實參:供形參使用的值叫做實參,入下例的3,4。

def printMax(a, b):

if a > b:

print a, 'is maximum'

else:

rint b, 'is maximum'

printMax(3, 4)

4、局部變量

#當你在函數定義內聲明變量的時候,它們與函數外具有相同名稱的其他變量沒有任何關係,即變量名稱對

於函數來說是 局部 的。這稱爲變量的 作用域 

使用global可將局部變量定義爲全局變量

例:

def func():

global x

print 'x is', x

x = 2

print 'Changed local x to', x

x = 50

func()

print 'Value of x is', x

結果:

x is 50

Changed global x to 2

Value of x is 2

5、參數

關鍵參數

#如果你的某個函數有許多參數,而你只想指定其中的一部分,那麼你可以通過命名來爲這些參數賦值——

這被稱作 關鍵參數

我們使用名字(關鍵字)而不是位置,來給函數指定實參。這樣做有兩個優勢一,由於我們不必擔心參數的順序,使用函數變得更加簡單了。二、假設其他參數

都有默認值,我們可以只給我們想要的那些參數賦值。下列中的b=5,c=10爲默認參數,在不填寫時爲默認值。

例子:

def func(a, b=5, c=10):

print 'a is', a, 'and b is', b, 'and c is', c

func(3, 7)

func(25, c=24)

func(c=50, a=100)

輸出:

a is 3 and b is 7 and c is 10

is 25 and b is 5 and c is 24

a is 100 and b is 5 and c is 50

動態參數:

例1:

def func(*args):

print args

執行1:func(11,33,4,4454,5)

執行2:li = [11,2,2,3,3,4,54] func(*li)

例2:

def func(**kwargs):

print args

執行1:func(name='lxb',age=21)

執行2:dic = {'name':'lxb', age:21, 'gender':'male'} func(**dic)

執行3:

def func(*args, **kwargs):

print args

print kwargs

6、返回值

#return 語句用來從一個函數 返回 即跳出函數。我們也可以從函數 返回一個值 。

def maximum(x, y):

if x > y:

return x

else:

return y

print maximum(2, 3)

三、內置函數

1、nmap #遍歷序列,對序列每個元素進行操作,最終獲取新序列。

#每個元素增加100

li=[11,22,33]

new_list=map(lambda a:a+100,li)

#兩個序列相加

li=[11,22,33]

li1=[1,2,3]

new_list=map(lambda a,b:a+b,li,li1)

2、filter #對序列中的每個元素進行篩選,最終獲得符合條件的序列。

new_list=filter(lambda arg:arg>12,li)#獲取大於12的序列

3、reduce #對序列內所有元素進行累計操作

li=[11,22,33]

result=reduce(lambda arg1,arg2:arg1+arg2,li)

# reduce的第一個參數,函數必須要有兩個參數

# reduce的第二個參數,要循環的序列

# reduce的第三個參數,初始值(可爲空)

四、yielod生成器

range和xrange的區別

rangge會在內存中創建所有指定的數字,而xrange,只有在迭代循環,纔去創建每個數組

自定義range

def nrange(num):

    temp = -1

    while True:

        temp = temp + 1

        if temp >= num:

            return

        else:

            yield temp #記憶此時內容並退出函數

五、冒泡算法

按從小到大對列表[13,22,6,99,11]進行排序

思路相鄰兩個值進行比較,較大的值放在右側,依次進行比較。

li = [13, 22, 6, 99, 11]


for i in range(1,5):

for m in range(len(li)-i): 

if li[m] > li[m+1]:

temp = li[m+1]

li[m+1] = li[m]

li[m] = temp

六、裝飾器

1、手工裝飾

import time

#裝飾器是一個函數,而其參數爲另一個參數

def timeit(func):

def wrapper(): #在內部定義了一個函數,封裝添加的功能

start = time.clock() #放一些在執行函數前的代碼

func() #執行原始函數

end = time.clock() # #放一些執行函數後的代碼

print 'used:', end - start

return wrapper #返回封裝函數,封裝函數已包含函數執行前後執行的代碼

@timeit #等於foo=timeit(foo),即裝飾器返回的是封裝函數

def foo():

print('in foo()')

foo() #執行封裝函數,即執行的不是原函數而是封裝後的函數

print(foo.__name__) #被修飾後函數名變爲wrapper

2、使用functools裝飾器裝飾

#函數是有幾個特殊屬性比如函數名,在被裝飾後,上例中的函數名foo會變成包裝函數的名字wrapper,

#它能將裝飾過的函數的特殊屬性保留。

import functools

def timeit(func):

@functools.wraps(func)

def wrapper():

start=time.clock()

func()

end=time.clock()

print 'used:', end - start

return wrapper

@timeit

def foo():

print 'in foo()'

foo()

print foo.__name__ #函數名還是之前的函數名foo


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