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()用来创造生成器,迭代器最大特性是惰性求值,尤其适用于大数据求值。

扫描二维码关注公众号,回复: 10072853 查看本文章
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

发布了78 篇原创文章 · 获赞 83 · 访问量 5416

猜你喜欢

转载自blog.csdn.net/qxyloveyy/article/details/104536291