Python程序設計之函數(2)

1.接受兩個參數,第一個參數爲x(類型爲列表),第二個參數爲n(表示一個在x中出現的數字),找出n在x中的位置,並將比n大的數放在n前,比n小的數放在n之後。
方法①,使用兩個列表來實現數據的比較

#找出n在x中的位置,並將比n大的數放在n前,比n小的數放在n之後
import random
def dem6(x,n):
    if n not in x:
        print('the number n not in the list:',x)
        return
    j=x.index(n)
    x[0],x[j]=x[j],x[0]
    key=x[0]
    j=0
    i=len(x)-1
    while j<i:
        while j<i and x[i]>=key:
            i-=1
        x[j]=x[i]
        while j<i and x[j]<=key:
            j+=1
        x[i]=x[j]
        x[j]=key
    return (x,x.index(n))
x=list(range(1,10))
random.shuffle(x)
print(x)
print(dem6(x,4),end='\n')
print(x)

方法②使用三個列表最後合併的方法來實現

#方法二
import random
import re
def dem61(x,n):
    if n not in x:
        print('error:',x)
        return
    #i=x.index(n)
    m=[]
    c=[]
    d=[]
    for i in range(len(x)):
        if x[i]<n:
            m.append(x[i])
        elif x[i]>n:
            c.append(x[i])
        else:
            d.append(x[i])
    return m+d+c
x=list(range(1,10))
random.shuffle(x)
print(x)
print(dem61(x,4),end='\n')
print(x)

運行效果如下:

[7, 8, 4, 3, 5, 2, 1, 9, 6]
([1, 2, 3, 4, 5, 7, 8, 9, 6], 3)
[1, 2, 3, 4, 5, 7, 8, 9, 6]
[6, 5, 7, 8, 1, 4, 3, 2, 9]
[1, 3, 2, 4, 6, 5, 7, 8, 9]
[6, 5, 7, 8, 1, 4, 3, 2, 9]

2.計算字符匹配數率,即有一個原始字符串,計算輸入字符串與原始字符串的匹配個數,可以通過正則表達式來實現

#計算字符匹配速率
import re
import string
s1='Input your password: QQ !'
s2 = str(input('Input:'))
def rate(s1,s2):
    if not isinstance(s1,str) and isinstance(s2,str):
        print('Input type error!')
        return
    d=re.split(r'\s',s1)
    f=re.split('\\s',s2)
    p=0
    print(f)
    if len(f)>len(d):
        print('Your input is too lang!',end='')
        return
    for i,j in zip(d,f):	#方法一採用zip()函數來實現比較
        if i==j:
            p+=1
    return p/len(d)
    #for i in range(len(d)):	#方法二通過列表的比較來實現
    #        if f[i]==d[i]:
    #            p+=1
    #return p/len(d)
print(rate(s1,s2),end='\n')

3.內置函數講解
①map()函數
map()將一個單參數函數依次作用到一個序列或迭代器對象的每個元素上,並返回一個map對象作爲結果。

print(list(map(str,range(5))),end='\n') #map調用單參數函數str(),將數列轉換爲字符串數列,再將轉換爲列表
def add(x):
    return x+5
#l=int(input())
print(list(map(add,range(10))),end='\n')
#print(list(map(add,l)),end='\n')

輸出結果:

['0', '1', '2', '3', '4']
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

②reduce()函數
reduce()將一個接收兩個參數的函數以累積方式從左到右依次作用到一個序列或迭代器對象的所有元素上,需要調用functools模塊中的reduce模塊。

import functools
print(functools.reduce(lambda x,y:x+y,[1,2,3,4,5,6]),end='\n')
def add1(x,y):
    return x+y
print(functools.reduce(add1,[1,2,3,4,5,6]),end='\n')
print(functools.reduce(add1,range(7)),end='\n')
print(functools.reduce(add1,map(add,[1,2,3,4,5,6])),end='\n')

輸出結果:

21
21
21
51

③filter()函數
filter()將一個單參數函數作用到一個序列上,返會該序列中使得該函數返回值爲True的那些元素組成的序列。

a=['1','a','b','***','x41']
def fun(x):
    return x.isalnum()
print(list(filter(fun,a)),end='\n')
print([x for x in a if x.isalnum()],end='\n')
print(list(filter(lambda x:x.isalnum(),a)),end='\n')

輸出結果:

['1', 'a', 'b', 'x41']
['1', 'a', 'b', 'x41']
['1', 'a', 'b', 'x41']

④yield生成器
yield()用來創造生成器,迭代器最大特性是惰性求值,尤其適用於大數據求值。

def f():
    a,b=1,2
    while True:
        yield a
        a,b=b,a+b
        #print(a,end=' ')
a=f()
for i in range(10):
    print(a.__next__(),end=' ')

for i in f():
    if i>100:
        break
    print(i,end=' ')

print('\n')

輸出結果:

1 2 3 5 8 13 21 34 55 89 1 2 3 5 8 13 21 34 55 89 

⑤dis模塊
dis模塊,查看函數字節碼指令

#dis模塊,查看函數字節碼指令
def add2(n):
    n+=1
    return n
import dis
print(dis.dis(add2),end='\n')
print('\n')

輸出結果:
在這裏插入圖片描述

⑥函數嵌套與可調用對象
a)函數嵌套

def add4(a,b):
    def muplay(x):
        return a*x+b
    return muplay(5)
print(add4(5,6),end='\n')

輸出結果:31

b)可調用對象
任何包含__call__()方法的類的對象都是可以調用的

class a:
    def __init__(self,a,b):
        self.a=a
        self.b=b
    def __call__(self,x):
        return self.a*x+self.b
#print(a(5,6),end='\n')
text=a(5,6)
print(text(6),end='\n')

輸出結果:36

4.判斷素數

#判斷素數
import math
def isPrimer(n):
    if not isinstance(n,int):
        print('Input type error!',end='\n')
        return
    m=int(math.sqrt(n)+1)
    for i in range(2,m):
        if n%i==0 and i<n:
            return False
    return True

def main(n):
    if isPrimer(n):
        print(n,'is primer',end='\n')
        return
    else:
        print(n,'is not a primer',end='\n')
        return
main(11)

5.解析字符串
輸出包含字符類型和數量的元組

import re
def jiexi(s):
    if not isinstance(s,str):
        print('error!')
        return
    m=n=c=d=0
    for i in range(len(s)):
        if s[i].isupper():
            m+=1
        elif s[i].islower():
            n+=1
        elif s[i].isdigit():
            d+=1
        else:
            c+=1
    #U=['Upper',m]
    t=['Upper','Lower','Digit','String']
    num=[m,n,d,c]
    for i in range(4):
        print(tuple([t[i],num[i]]),end=' ')
    #U=tuple(['Upper',m])
    #print(U,L,D,S,end='')
n='hello Hello !abcd efgh 123 445'
jiexi(n)

輸出結果:

('Upper', 1) ('Lower', 17) ('Digit', 6) ('String', 6)

6.輸出輸入的多個數據中的最大值和它們的和

def numn(*p):
    p=re.split(r'\s',*p)
    #print(p)
    n=0
    d=[]
    print(p)
    for i in range(len(p)):
        n+=int(p[i])
        d.append(int(p[i]))
    #n=sum(list(p))
    return tuple([n,max(d)])
print(numn(input()),end=' ')

輸出結果:


輸入:12 20 25 26
輸出:['12', '20', '25', '26']
輸出:(83, 26) 
``

學習筆記:
1.Python函數不同與其他編程語言可以使用嵌套的形式實現,例如def a(): def m():這種形式
2.Python函數作用域內變量可以通過global關鍵字來定義全局變量
3.如果函數沒有return語句或者return語句後面不帶參數,則返回None
4.包含yield語句的函數可以用來創建生成器
5.Python函數內置函數map(func(m),range)調用的是帶一個參數的函數;filter(func(m),range)返回函數調用範圍爲True的值;reduce(func(a,b),range)調用帶兩個參數的函數或者lambda表達式;
6.dis模塊中的dis函數用來查看函數字節碼指令
7.帶有__call___()函數的類,類對象可以調用此函數
例如:

class b:
    def __init__(self,a):
        self.a=a
    def __call__(self,b):
        return self.a+b
m=b(5)
print(m(3),end='\n')

會返回結果:5
機制大概如下:
m=b(5)=>m可以調用類中函數
m(5)=>m.call(5,5)=>輸出結果10

函數基礎參看文章:
https://editor.csdn.net/md/?articleId=104515633

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