(董付国)Python 学习笔记---Python函数设计与使用(3)

5.7 案例精选

例 5-1:编写函数计算圆的面积。

>>> from math import pi as PI
>>> def CircleArea(r):
...     if isinstance(r,(int,float)):           #确保接收的参数为数值
...             return PI*r*r
...     else:
...             print('You must give me an integer or float as radius.')
...
>>> print(CircleArea(3))
28.274333882308138

例 5-2:编写函数,接受任意多个实数,返回一个元组,其中第一个元素为所有参数的平均值,其他元素为所有参数中大于平均值的实数。

>>> def demo(*para):
...     avg = sum(para)/len(para)
...     g = [i for i in para if i>avg]
...     return (avg,)+tuple(g)
...
>>> print(demo(1,2,3,4))
(2.5, 3, 4)

例 5-3:编写函数,接受字符串参数,返回一个元组,其中第一个元素为大写字母的个数,第二个元素为小写字母个数。

>>> def demo(s):
...     result = [0,0]
...     for ch in s:
...             if 'a'<=ch<='z':
...                     result[1]+=1
...             elif 'A'<=ch<='Z':
...                     result[0]+=1
...     return tuple(result)
...
>>> print(demo('aaabbbbC'))
(1, 7)

例 5-4:编写函数,接受包含20个整数的列表lst和一个整数k作为参数,返回新列表。处理规则为:将列表lst中下标k之前的元素逆序,下标k之后的元素逆序,然后将整个列表lst中的所有元素再逆序。

>>> def demo(lst,k):
...     x = lst[:k]
...     x.reverse()
...     y = lst[k:]
...     y.reverse()
...     r = x+y
...     r.reverse()
...     return r
...
>>> lst = list(range(1,21))
>>> print(demo(lst,5))
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1, 2, 3, 4, 5]

也可以,这样做更为简便:

>>> def shift(lst,k):
...     return lst[k:]+lst[:k]
...
>>> x = list(range(20))
>>> shift(x,3)
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2]
>>> shift(x,-3)
[17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

例 5-5:编写函数,接受整数参数t,返回斐波那契额数列中大于t的第一个数。

>>> def demo(t):
...     a,b = 1,1
...     while b<t:
...             a,b = b,a+b
...     else:
...             return b
...
>>> print(demo(50))
55

例 5-6:编写函数,接受一个包含若干整数的列表参数lst,返回一个元组,其中第一个元素为列表lst中的最小值,其余元素为最小值在列表lst中的下标。

>>> def demo(lst):
...     m = min(lst)
...     result = (m,)
...     for index,value in enumerate(lst):				#枚举:索引和数值
...             if value==m:
...                     result = result + (index,)
...     return result
...
>>> import random
>>> x = [random.randint(1,20) for i in range(50)]
>>> print(x)
[13, 11, 3, 10, 13, 2, 19, 9, 1, 17, 12, 7, 2, 6, 11, 13, 5, 8, 6, 13, 14, 13, 15, 20, 2, 12, 17, 4, 19, 19, 18, 6, 18, 4, 6, 3, 2, 2, 11, 13, 14, 9, 9, 18, 11, 4, 17, 13, 6, 3]
>>> print(demo(x))
(1, 8)

※※※例 5-7:编写函数,接受一个整数t为参数,打印杨辉三角前t行。

>>> def demo(t):
...     print([1])
...     print([1,1])
...     line = [1,1]								#每一行不变的内容,两端
...     for i in range(2,t):
...             r = []
...             for j in range(0,len(line)-1):		#以第二行为基准向中间添加内容	
...                     r.append(line[j]+line[j+1])
...             line = [1]+r+[1]
...             print(line)
...
>>> demo(10)
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

例 5-8:编写函数,接受一个正偶数为参数,输出两个素数,并且这两个素数之和等于原来的正偶数。如果存在多组符合条件的素数,则全部输出。

>>> import math
>>> def IsPrime(n):
...     m = int(math.sqrt(n))+1
...     for i in range(2,m):
...             if n%i == 0:
...                     return False
...     return True
...
>>> def demo(n):
...     if isinstance(n,int) and n>0 and n%2==0:
...             for i in range(3,n//2+1):				#只用循环前半段,因为后半段的重复了
...                     if IsPrime(i) and IsPrime(n-i):
...                             print(i,'+',n-i,'=',n)
...
>>> demo(60)
7 + 53 = 60
13 + 47 = 60
17 + 43 = 60
19 + 41 = 60
23 + 37 = 60
29 + 31 = 60
>>> demo(57)
>>> demo(20)
3 + 17 = 20
7 + 13 = 20

例 5-9:编写函数,接受两个正整数作为参数,返回一个元组,其中第一个元素为最大公约数,第二个元素为最小公倍数(两个数的积处以最大公约数)。

>>> def demo(m,n):
...     if m>n:
...             m,n = n,m
...     p = m*n
...     while m!=0:
...             r = n%m
...             n = m
...             m = r
...     return(n,p//n)
...
>>> print(demo(12,30))
(6, 60)

- Python标准库已经提供了计算最大公约数的方法了

>>> import math
>>> math.gcd(12,30)
6

例 5-10:编写函数,接收一个所有元素值都不相等的整数列表和一个整数n,要求将值为n的元素作为支点,将列表中所有值小于n的元素全部放到n的前面,所有值大于n的元素放到n后面。

算法形式的写法:

import random
def demo(x,n):
        if n not in x:
            print(n,' is not an element of ',x)
            return
        i = x.index(n)                              #获取指定元素在列表中的索引
        x[0],x[i] = x[i],x[0]                       #将指定元素与第0个元素交换
        key = x[0]
        i = 0
        j = len(x) - 1
        while i<j:
            while i<j and x[j]>=key:                #从后向前寻找第一个比指定元素小的元素
                j-=1
            x[i] = x[j]
            while i<j and x[i]<=key:                #从前向后寻找第一个比指定元素大的元素
                i+=1
            x[j] = x[i]
        x[i] = key
x = list(range(1,10))
random.shuffle(x)
print(x)
demo(x,4)
print(x)

运行结果:

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

快速排序思路:
在这里插入图片描述
非算法形式的写法(效率一般,遍历两次):

import random
def demo(x,n):
    t1 = [i for i in x if i<n]
    t2 = [i for i in x if i>n]
    return t1+[n]+t2
x = list(range(1,10))
random.shuffle(x)
print(x)
print(demo(x,4))

例 5-11:编写函数,计算字符串匹配的准确率。以打字练习为例,假设origin为原始内容,userInput为用户输入的内容,下面的代码用来测试用户输入的准确率。
写法一:

def Rate(origin,userInput):
    if not(isinstance(origin,str) and isinstance(userInput,str)):
        print('The two parameters must be strings.')
        return
    if len(origin)<len(userInput):
        print('Sorry,I suppose the second parameter string is shorter.')
        return
    right = 0                                           #精确匹配的字符个数
    for origin_char,user_char in zip(origin,userInput):
        if origin_char == user_char:
            right+=1
    return right/len(origin)

origin = 'Shandong Institute of Business and Technology'
userInput = 'Shandong institute of businiSs and TeChnology'
print(Rate(origin,userInput))                           #输出测试结果

运行结果:

0.8888888888888888

写法二:

def Rate(origin,userInput):
    if not(isinstance(origin,str) and isinstance(userInput,str)):
        print('The two parameters must be strings.')
        return
    if len(origin)<len(userInput):
        print('Sorry,I suppose the second parameter string is shorter.')
        return
    sum(1 for origin_char,user_char in zip(origin,userInput) if origin_char==user_char)
    return sum(1 for origin_char,user_char in zip(origin,userInput) if origin_char==user_char)/len(origin)

origin = 'Shandong Institute of Business and Technology'
userInput = 'Shandong institute of businiSs and TeChnology'
print(Rate(origin,userInput))                           #输出测试结果

运行结果:

0.8888888888888888
posted @ 2019-08-31 17:57  旅人_Eric  阅读(2621)  评论(0编辑  收藏  举报