python输入函数设计_(董付国)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

... 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

while i=key: #从后向前寻找第一个比指定元素小的元素

j-=1

x[i] = x[j]

while i

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

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)

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)

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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值