1 编写函数,接收任意多个实数,返回一个元组,其中第一个元素为所有参数的平均值,其他元素为所有参数中大于平均值的实数。
def func(*parameter):
avg = sum(parameter) / len(parameter) # 平均值
g = [i for i in parameter if i > avg] # 列表推导式
return (avg,) + tuple(g)
print(func(12, 8, 45, 22, 76, 89, 15))
2 编写函数,接收字符串参数,返回一个元组,其中第一个元素为大写字母个数,第二个元素为小写字母个数。
def func(s):
get = [0, 0]
for i in s:
if i.islower():
get[1] += 1
elif i.isupper():
get[0] += 1
return tuple(get)
print(func('Bee Keepers Take Honey From Their Hives'))
3 编写函数,接收包含 n 个 整数的列表 s 和一个整数 k(0 ≤ k < n)作为参数返回新列表。处理规则为:将列表 s 中下标 k (不包括 k)之前的元素逆序,下标 k (包括 k)之后的元素逆序,然后将整个列表 s 中的所有元素逆序。(将列表循环左移 k 位的算法实现)
def func(s, k):
x = s[k - 1::-1]
y = s[:k - 1:-1]
return list(reversed(x + y))
v = [28, 31, 30, 29, 16, 21]
print(func(v, 3))
def func(s, k):
temp = s[:]
for i in range(k):
# pop(0)操作在列表首部删除元素,这会引起大量元素的移动
temp.append(temp.pop(0))
return temp
v = [28, 31, 30, 29, 16, 21]
print(func(v, 3))
# 使用切片可以直接实现,可以达到最快的速度
def func(s, k):
return s[k:] + s[:k]
v = [28, 31, 30, 29, 16, 21]
print(func(v, 3))
Python 标准库 collections 提供的双端队列可以直接实现循环左移位和右移位,更加灵活方便。
from collections import deque
v = [28, 31, 30, 29, 16, 21]
Q = deque(v) # 创建双端队列
Q.rotate(3) # 循环右移位
print(Q)
Q.rotate(-3) # 循环左移位
print(Q)
4 编写函数,接受一个整数 t 作为参数,打印杨辉三角前 t 行。
def yanghui_triangle(t):
print([1])
line = [1, 1]
print(line)
for i in range(2, t):
get = []
for j in range(0, len(line) - 1):
get.append(line[j] + line[j + 1])
line = [1] + get + [1]
print(line)
yanghui_triangle(7)
5 编写函数,接收两个正整数作为参数,返回一个元组,其中第一个元素为最大公约数,第二个元素为最小公倍数。
def func(x, y):
z = x * y
while x % y != 0:
x, y = y, x % y
return y, z // y
print(func(18, 24))
Python 标准库 fractions 中提供了 gcd() 函数用来计算最大公约数。标准库 math 也提供了计算最大公约数的函数 gcd()。
def func(x, y):
import math
i = math.gcd(x, y)
return i, (x * y) // i
print(func(18, 24))
6 编写函数,计算形如 a+aa+aaa+aaaa+…+aaa…aaa 的表达式的值,其中 a 为小于 10 的自然数。
# C
def func(v, n):
get, t = 0, 0
for i in range(n):
t = t * 10 + v
get += t
return get
print(func(3, 4))
# Pythonic
def func(v, n):
v = str(v)
get = sum(eval(v * i) for i in range(1, n + 1))
return get
print(func(3, 4))
7 编写函数,模拟二分查找。
def binarySearch(s, v):
low = 0
high = len(s) - 1
while low <= high:
mid = (low + high) // 2
if v == s[mid]:
return mid
elif v > s[mid]:
low = mid + 1
elif v < s[mid]:
high = mid - 1
return False
from random import randint
s = [randint(0, 20) for i in range(10)]
s.sort()
print(s)
print(binarySearch(s, 18))
print(binarySearch(s, 8))