文章出處

Python第七天   函數  函數參數   函數變量   函數返回值  多類型傳值    冗余參數   函數遞歸調用   匿名函數   內置函數   列表表達式/列表重寫

 

目錄

Pycharm使用技巧(轉載)

Python第一天  安裝  shell  文件

Python第二天  變量  運算符與表達式  input()與raw_input()區別  字符編碼  python轉義符  字符串格式化

Python第三天 序列  5種數據類型  數值  字符串  列表  元組  字典

Python第四天   流程控制   if else條件判斷   for循環 while循環

Python第五天   文件訪問    for循環訪問文件    while循環訪問文件   字符串的startswith函數和split函數

Python第六天   類型轉換

Python第七天   函數  函數參數   函數變量   函數返回值  多類型傳值    冗余參數   函數遞歸調用   匿名函數   內置函數   列表表達式/列表重寫

Python第八天  模塊   包   全局變量和內置變量__name__    Python path

Python第九天  面向對象  類定義   類的屬性    類的方法    內部類   垃圾回收機制   類的繼承 裝飾器

Python第十天   print >> f,和fd.write()的區別    stdout的buffer  標準輸入 標準輸出  標準錯誤   重定向 輸出流和輸入流

Python第十一天    異常處理  glob模塊和shlex模塊    打開外部程序和subprocess模塊  subprocess類  Pipe管道  operator模塊   sorted函數   生成器  walk模塊   hashlib模塊

Python第十二天     收集主機信息     正則表達式  無名分組   有名分組

Python第十三天   django 1.6   導入模板   定義數據模型   訪問數據庫   GET和POST方法    SimpleCMDB項目   urllib模塊   urllib2模塊  httplib模塊  django和web服務器整合  wsgi模塊   gunicorn模塊

Python第十四天 序列化  pickle模塊  cPickle模塊  JSON模塊  API的兩種格式

Python第十五天  datetime模塊 time模塊   thread模塊  threading模塊  Queue隊列模塊  multiprocessing模塊  paramiko模塊  fabric模塊  

 

 

 

Python函數
函數就是完成特定功能的一個語句組,這組語句可以作為一個單位使用,并且給它取一個名字。
可以通過函數名在程序的不同地方多次執行(這通常叫函數調用)。

函數定義要在函數調用之前,否則函數調用會找不到要調用的函數  跟編譯型語言不一樣!!!!!!!!!

 

函數要寫在python文件的最前面,否則NameError: name 'wordCount' is not defined

import os
import sys
import string






s="""hello world python"""

wordCount(s)


def wordCount(s):
    chars=len(s)
    words=len(s.split())
    lines=s.count('\n')
    print lines,words,chars
Traceback (most recent call last):
  File "G:/py/pytest33/test123.py", line 20, in <module>
    wordCount(s)
NameError: name 'wordCount' is not defined

 



預定義函數
可以直接使用

自定義函數
用戶自己編寫



函數的定義和調用
//定義
def 函數名([參數列表]):
函數名:如果由多個單詞組成,第二個單詞的首字母應該大寫   

//調用
函數名([參數列表])
     
#!/usr/bin/python

def fun():
    sth = raw_input("Please input something: ")
    try:
        if type(int(sth)) == type(1):
            print "%s is a number" %sth
    except ValueError:
        print "%s is not number" %sth

fun()

最好這樣寫if type(int(num)) == type(1)
type返回的不是字符串,是type對象。

 

 

函數名賦值給變量
int2give = int
print int2give('3')


------------------------------------------
函數參數

形式參數和實際參數
- 在定義函數時,函數名后面括號中的變量名稱叫做“形式參數”,或者稱為“形參”
- 在調用函數時,函數名后面括號中的變量名稱叫做“實際參數”,或者稱為“實參”





in的用法
if  i  in '0123456789'
if  plus_one in  range(10)


sys.argv跟shell內置變量一樣
sys.argv[0] 相當于 $0表示腳本本身
sys.argv[1] 相當于 $1 第一個參數
sys.argv[2] 相當于 $2 第二個參數
sys.argv     返回所有參數列表['memory.py', '2', 'uu']
len(sys.argv)   參數的個數

 


#!/usr/bin/python
import sys
import os

def isNum(s):
    for i in s:
        if i in '0123456789':
            pass
        else:
            #print "%s is not a number" %s
            break
    else:
        print s


isNum(sys.argv[1])


----------------------------------

 

練習
打印系統的所有PID
要求從/proc讀取。
os.listdir()
os.listdir:列出目錄下的所有文件和目錄,列表形式,每個列表元素都是字符串

打印系統的所有PID
要求從/proc讀取。
os.listdir()
os.listdir:列出目錄下的所有文件和目錄,列表形式,每個列表元素都是字符串


#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__="huazai"
"""
pycharm 使用指南
Date:2016.08.12
"""

import os
import sys
import string


def isNum(s):
    for i in s:
        if i in '0123456789':
            pass
        else:                # print "%s is not a number" %s
            break
    else:
        print s


for i in os.listdir('/proc'):
    isNum(i)

    
或
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__="huazai"
"""
pycharm 使用指南
Date:2016.08.12
"""

import os
import sys
import string


def isNum(s):
    if s in '0123456789':
        print s

for i in os.listdir('/proc'):
    isNum(i)

 

----------------------------------------------------------

函數默認參數
缺省參數(默認參數)
def fun(x, y=100):
print x,y
默認參數只能寫在最右邊,否則會報錯 def fun(y=100,x): 這個報錯

fun(1,2)
fun(x=1,y=2) 傳參的另一種方式,不過比較啰嗦很少用
fun(1)

---------------------------------------------------------
函數變量
局部變量和全局變量
- Python中的任何變量都有特定的作用域
- 在函數中定義的變量一般只能在該函數內部使用,這些只能在程序的特定部分使用的變量我們稱之為局部變量
- 在一個文件頂部定義的變量可以供文件中的任何函數調用,這些可以為整個程序所使用的變量稱為全局變量

global語句
global 變量名
強制聲明為全局變量

全局變量在函數外聲明,在函數里面global引用全局變量
在函數里面global聲明全局變量,在函數外可以引用這個全局變量

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__="huazai"
"""
pycharm 使用指南
Date:2016.08.12
"""

import os
import sys
import string

x = 100


def fun():
    global x
    x += 1
    print x

fun()
print x

 

 


globals函數打印當前環境的所有全局變量,返回字典
locals函數打印當前環境的所有局部變量,返回字典

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__="huazai"
"""
pycharm 使用指南
Date:2016.08.12
"""

import os
import sys
import string





x = 100
def fun():
    x = 1
    y = 1
    print locals()



fun()
print globals()

 


-------------------------------------------------------

函數返回值
- 函數被調用后會返回一個指定的值
- 函數調用后默認返回None
- return 返回值
- 返回值可以是任意類型
- return執行后,函數終止
- return與print區別


------------------------------
多類型傳值

元組傳參
實參前面加一個* 傳入元組,元組要放在右邊
def fun(x,y,z)
return x+y+z
t1=(2,3,4)
t=(1,2)
fun(*t1)
fun(*(1,2,3))
fun(1,*t)

 

字典傳參
字典的key的名字要跟形參的名字一樣,x,y,z否則會報錯
def fun(x,y,z)
return x+y+z
dic = {'x':1,'y':3,'z':5}
fun(**dic)

 

冗余參數
向函數傳元組和字典
處理多余實參
def fun(x,y,*args,**kwargs)


fun(1,2,'a',[2,4],y=2,z=3)
fun(1,2,'a',[2,4],*t,y=2,**{'u':12})


--------------------------------
函數遞歸調用

計算階層
遞歸調用
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)

print factorial(5)


注意事項
必須有最后的默認結果: if n == 0
遞歸參數必須向默認結果收斂的: factorial(n-1)

 

打印目錄下所有文件

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__="huazai"
"""
pycharm 使用指南
Date:2016.08.12
"""

import os
import sys
import string


def print_files(path):
    # isdir, isfile, join = os.path.isdir, os.path.isfile, os.path.join
    # print isdir,isfile,join


    lsdir = os.listdir(path)
    dirs = [i for i in lsdir if os.path.isdir(os.path.join(path, i))]
    files = [i for i in lsdir if os.path.isfile(os.path.join(path, i))]

    if dirs:
        for d in dirs:
            print_files(os.path.join(path, d))

    if files:
        for f in files:
            print os.path.join(path, f)


print_files(sys.argv[1])

把函數名賦值給變量
# isdir, isfile, join = os.path.isdir, os.path.isfile, os.path.join
# print isdir,isfile,join

 

 

---------------------------------------------------------------------------

匿名函數
lambda函數是一種快速定義單行的最小函數,可以用在任何需要函數的地方。
lambda語句中,冒號前是參數,可以有多個,逗號隔開,冒號右邊是返回值。
lambda語句構建的其實是一個函數對象

def fun(x, y):
return x*y
fun(2, 3)
r = lambda x,y: x*y
r(2, 3)

def add(x, y):
return x + y
sum = reduce(add, [1, 2, 3])

reduce(lambda x,y:x+y, range(1,4))

 

匿名函數優點:
- 1.使用python寫一些腳本時,使用lambda可以省去定義函數的過程,讓代碼更加精簡。
- 2. 對于一些抽象的,不會被別的地方再重復使用的函數,有時候函數起個名字也是個難題,使用lambda不需要考慮命名的問題。
- 3. 使用lambda在某些時候讓代碼更容易理解。

 

-------------------------------------------

內置函數

所有內置函數和內置類都在__builtin__模塊(__builtin__前后雙下劃線)
查詢內置函數和類
https://docs.python.org/2/library/index.html


絕對值,最大最小值
abs()
max()
max('12345','789')
字符串'789‘比字符串’12345‘大,字符串是從左到到右開始比較的,'7’比‘1'大,所以輸出’789'
min()

len() 參數是一個對象(字符串,元組,字典)不能是整數
divmod() 參數是兩個數字,返回商和余數
pow() 乘方
round() 給出小數點的精度,沒有第二個參數直接四舍五入

常用函數
callable() 可被調用的,例如類,函數
type()
isinstance() isinstance(s,(int,tuple,str)),s是一個對象,第二個參數是元組,判斷s這個對象的數據類型在不在第二個參數元組里,是返回true ,否返回false

class A(object):
    pass

a=A()
print isinstance(a,A)

 

cmp() 如果是字符串,則逐個字符比較,一旦有字符比較出來就不往下比較
range()
xrange()

類型轉換函數
int() 參數如果是字符串,只能是純數字字符串,不能帶小數
long() 參數如果是字符串,只能是純數字字符串,不能帶小數
float() 參數如果是字符串,只能是純數字字符串,不能帶小數
complex()
str()
list()
tuple()
hex()
oct()
chr() 輸入0<x<256 返回ascii字符
ord() 輸入ascii的單個字母,返回數字
eval() 將有效表達式求值,其實就是去掉字符串

 

 

字符串處理函數
下面函數實例化一個string對象或聲明一個string變量
str.capitalize()   將字符串里的第一個字符大寫并返回
str.replace()   replace(old,new,count)
str.split()   字符串切成列表 不指定分隔符,那么默認以空格,tab鍵,換行符作為分隔 split('.',1) 點為分隔,切1次
str.join()     列表連接為字符串 ''.join([str(i)  for i in range(10)])  join會在被插入字符中間插入 ','.join([str(i)  for i in range(10)]) 逗號變為的分隔符
s= 'sdf'
s.join('22')
'2sdf2'

靜態函數,不需要實例化一個string對象
string模塊   import  string
string.capitalize('hello')
string.replace('wecan','a','t')
string.split('we,w,e',',')
string.join('ww','tt')



序列處理函數
len()
max()
min()
filter()   filter(none/func, seq) 如果不是none,func這個函數依次對sequence里的元素做處理,最后返回一個list, tuple, or string。

 

zip() 合并多個列表、元組
l1=[1,2,3]
l2=['a','b','c']

zip(l1,l2)
[(1, 'a'), (2, 'b'), (3, 'c')]
dict(zip(l1,l2)) 從中創建字典

l1=(1,2,3)
l2=['a','b','c']
print zip(l1,l2)
[(1, 'a'), (2, 'b'), (3, 'c')]




map()   map(none,l1,l2,l3)跟zip函數一樣,元素最少的那個序列以none補充,map(func,seq)對序列的每個元素都放進去函數里去處理,并且函數參數要與序列元素個數相同
與filter(func, seq)類似,但是filter(func, seq)只能處理單個序列

reduce() 函數,  reduce(func,seq)

使用lambda代入序列處理函數
filter(lambda x:x %2 ==0, range(10))
     [0, 2, 4, 6, 8]
map(lambda x,y:x*y, range(5),range(5))
     [0, 1, 4, 9, 16]
reduce(lambda x,y:x+y, range(1,101))
     5050





列表表達式/列表重寫
[i*2+10 for i in range(10)]

[i for i in range(10) if i%3 == 0]




提示

16行報錯,vim +16 xx.py

 


 

函數的參數不能是連字符

def f(x, **kwargs):
print x
print kwargs


f(1,a=10,b-b=20) 報錯 涉及變量的命名
f(1,a=10,b_b=20) 正確




變量的命名
- 變量名由字母、數字、下劃線組成。
- 變量不能以數字開頭
- 不可以使用關鍵字


In [1]: def f(x, **kwargs):
...: print x
...: print kwargs
...: f(1,a=10,b-b=20)
File "<ipython-input-1-35f95bb06c84>", line 4
f(1,a=10,b-b=20)
SyntaxError: keyword can't be an expression

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()