3.3.5 案例精选
1 编写函数计算圆的面积。
1 from math import pi as PI
2
3 def circle_area(r):
4 if isinstance(r,(int,float)):
5 return PI * r * r
6 else:
7 print('You must give an integer or float as radius.')
8
9 print('# 半径为3的圆的面积:',circle_area(3))
10 # 半径为3的圆的面积: 28.274333882308138
2 编写函数,接受任意多个实数,返回一个元组,其中第一个元素为所有参数的平均值,其他元素为所有参数中大于平均值的实数。
1 #实现过程 1
2 def get_num1(*a):
3
4 avg = sum(a)/len(a)
5
6 l = [avg]
7
8 for i in a:
9 if i > avg:
10 l.append(i)
11
12 return tuple(l)
13
14 #实现过程 2
15 def get_num2(*a):
16
17 avg = sum(a)/len(a)
18
19 t1 = (avg,)
20
21 def is_bigger(n):
22 return n > avg
23
24 t2 = tuple(filter(is_bigger,a))
25
26 return t1 + t2
27
28
29
30 #实现过程 3
31 def get_num3(*para):
32 avg = sum(para)/len(para)
33 g = [i for i in para if i > avg] #列表推导式
34 return (avg,) + tuple(g)
35
36 print(get_num3(1,2,3,4,5,6,7,8,9))
37
38 #(5.0, 6, 7, 8, 9)
3 编写函数,接收字符串参数,返回一个元组,其中第一个元素为大写字母的个数,第二个元素为小写字母的个数。
1 # 我的实现过程 2 3 def get_num(s): 4 5 #先判断传入的参数是否为字符串,如果不是结束程序。 6 if not isinstance(s,str): 7 return '在调用该函数时,请传入字符串作为参数' 8 else: 9 #定义一个变量表示大写字母的个数 10 a = 0 11 #定义一个变量表示小写字母的个数 12 b = 0 13 14 #判断如果s是空字符串,就没有必要进行下去了,结束程序 15 if s is '': 16 return '空字符串就没有必要继续处理了,结束' 17 else: 18 #遍历字符串,如果字符串的某个元素是小写字母,就b加1,是大写字母就 a加1 19 for i in s: 20 if i.islower(): 21 b += 1 22 if i.isupper(): 23 a += 1 24 return (a,b) 25 26 print(get_num('')) #空字符串就没有必要继续处理了,结束 27 print(get_num(123)) #在调用该函数时,请传入字符串作为参数 28 print(get_num('123')) #(0, 0) 29 print(get_num('hdwfegbngvjhdsafvdweBFEWIQAFBVDSAJFGQWEfkejdashgfFVBEQIRFAgfbewirfgvn BGEKFA')) #(34, 41) 30 31 32 #作者的实现过程 33 def demo(s): 34 result = [0,0] 35 for ch in s: 36 if 'a' <= ch <= 'z': 37 result[1] += 1 38 elif 'A' <= ch <= 'Z': 39 result[0] += 1 40 41 return tuple(result) 42 43 print(demo('hdwfegbngvjhdsafvdweBFEWIQAFBVDSAJFGQWEfkejdashgfFVBEQIRFAgfbewirfgvn BGEKFA')) #(34, 41)
4 编写函数,接收包含20个整数的列表lst和一个整数k作为参数,返回新列表。处理规则:将列表lst中下标k之前的元素逆序,下标k之后的元素逆序,然后将整个列表lst中所有元素逆序。
1 def get_num(lst,k):
2
3 # 判断lst是不是列表,是列表再进行接下来的操作
4 if not isinstance(lst,list):
5 return '要求参数lst是列表类型的数据哦,程序结束'
6 else:
7
8 # 判断传入的列表的元素个数是否为20个
9 if not len(lst) == 20 :
10 return '您输入列lst的元素个数不足20个,程序结束'
11 # 判断传入的参数k的值是否过大或过小,防止引起下标越界的报错
12 if k > 18 or k < 0:
13 return '您输入的参数k的值不在0-18的范围内,会引起下标访问越界'
14
15 #根据传入的参数k分隔lst
16 l1 = lst[:k]
17 l2 = lst[k:]
18
19 l1.sort(reverse=True)
20 l2.sort(reverse=True)
21
22 lr = l1 + l2
23
24 return l1,l2,sorted(lr,reverse=True)
25
26
27 print(get_num([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],7))
28
29
30 #作者的代码
31 def demo(lst,k):
32 x = lst[:k]
33 x.reverse()
34 y = lst[k:]
35 y.reverse()
36 r = x + y
37 return list(reversed(r))
38
39 #作者的代码好简洁啊,但健壮性就查了点,很容易因为调用者传入的参数不符合要求而出现异常
5 编写函数,接收整数参数t,返回斐波那契数列中大于t的第一个数。
1 def get_num(t):
2
3 a = b =1
4
5 while True:
6 a , b = b , a + b
7
8 if t < a :
9 return a
10 elif t > a and t < b:
11 return b
12
13
14 print(get_num(-1)) #1
15 print(get_num(7)) #8
16 print(get_num(100)) #144
6 编写函数,接收一个包含若干整数的列表参数lst,返回一个元组,其中第一个元素为列表lst中的最小值,其余元素为最小值在lst中的下标。
1 import random
2
3 def get_num(lst):
4
5 # 由于要求列表中的元素都要是整数,所以先判断元素
6 t = tuple(lst)
7 for i in t:
8 if not isinstance(i,int):
9 return 'lst中的元素 i = {}不是整数,不符合要求,请重新传入符合要求的列表'.format(i)
10
11 #开始找列表中元素的最小值
12 m = min(lst)
13
14 #对列表做一个转换,
15 l1 = list(enumerate(lst))
16
17 #获取列表元素的下标
18 l2 = []
19
20 for tu in l1:
21 if tu[1] == m:
22 l2.append(tu[0])
23
24 return (m,) + tuple(l2)
25
26 l = list(range(1,100))
27 random.shuffle(l)
28 l.append(1)
29 print(l)
30 print(get_num(l))
31
32 #[11, 60, 19, 25, 16, 24, 87, 67, 20, 44,
33 # 7, 10, 84, 73, 37, 42, 56, 68, 43, 91,
34 # 26, 3, 8, 14, 71, 94, 5, 31, 32, 34,
35 # 9, 17, 36, 69, 29, 12, 92, 41, 52, 57,
36 # 15, 74, 65, 82, 77, 75, 18, 47, 86, 45,
37 # 49, 2, 22, 64, 62, 33, 54, 1, 66,38,
38 # 88, 78, 30, 70, 58, 80, 95, 93, 79,55,
39 # 51, 6, 4, 40, 48, 39, 35, 89, 21,96,
40 # 90, 63, 81, 27, 61, 99, 72, 85, 98,23,
41 # 50, 53, 59, 28, 97, 76, 46, 13, 83,1]
42
43
44 #执行结果: (1, 57, 99)
作者的实现过程:
1 import random
2
3 def demo(lst):
4 m = min(lst)
5 result = (m,)
6 position = [index for index,value in enumerate(lst) if value == m]
7 result += tuple(position)
8
9 return result
10
11 x = [random.randint(1,100) for i in range(50)] #随机生成50条记录
12
13 print(demo(x))
14 #函数的执行结果 (2, 30, 39)
7 编写函数,接收一个整数t作为参数,打印杨辉三角前 t 行。
1
2 def demo(t):
3 result = [[1],[1,1]] #默认了前两项,从第三项开始加起的。
4 line = [1,1]
5
6 for i in range(2,t):
7 r = []
8 for j in range(0,len(line) - 1):
9 r.append(line[j] + line[j+1])
10
11 line = [1] + r + [1]
12 result.append(line)
13 return result
14
15 def output(result):
16 for item in result:
17 print(item)
18
19 output(demo(10))