66 函数精彩案例

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)

1

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我还记得那天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值