Python函数练习题

时间:2024-03-19 08:22:22

函数部分:

1.编写一个名为collatz()的函数,它有一个名为number的参数
   如果参数是偶数,那么collatz()就打印出number//2
   如果number是奇数,collatz()就打印3*number+1

Python函数练习题

def collatz(number):
    # if number % 2 == 0:
    #     print number // 2
    # else:
    #     print 3 * number + 1
    print number // 2 if number % 2 == 0 else 3 * number + 1

collatz(7)

输入4时:

Python函数练习题

输入7时:

Python函数练习题

 

2.编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.

     元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数

Python函数练习题

def cacluate(*num):
    li = []
    avg = sum(num)/len(num)
    for i in num:
        if i > avg:
            li.append(i)
列表生成式部分:
    return avg,li
count = cacluate(12,13,14,15,16)
print count

输入12,13,14,15,16时:

Python函数练习题

 

3. 编写函数, 接收一个列表(包含10个整形数)和一个整形数k, 返回一个新列表.

     函数需求:
        - 将列表下标k之前对应(不包含k)的元素逆序;
        - 将下标k及之后的元素逆序;

Python函数练习题

import random

def fun(alist, k):
    if k < 0 or k > len(alist):
        return 'error key'
    newL1 = alist[:k]
    newL2 = newL1[::-1]
    newL3 = alist[k:]
    newL4 = newL3[::-1]
    return newL2 + newL4

list = []
for i in range(10):
    num = random.randint(1, 50)
    list.append(num)
print list
a = fun(list, 4)
print a

结果:

Python函数练习题

 

4.模拟轮盘抽奖游戏

轮盘分为三部分: 一等奖, 二等奖和三等奖;
轮盘转的时候是随机的,
      如果范围在[0,0.08)之间,代表一等奖,
      如果范围在[0.08,0.3)之间,代表2等奖,
      如果范围在[0, 1.0)之间,代表3等奖,

模拟本次活动1000人参加, 模拟游戏时需要准备各等级奖品的个数.

Python函数练习题Python函数练习题

import random

rewardDict = {
    '一等奖': (0, 0.08),
    '二等奖': (0.08, 0.3),
    '三等奖': (0.3, 1)
}

def rewardFun():
    """用户得奖等级"""
    # 生成一个0~1之间的随机数
    num = random.random()
    # 判断随机转盘转的数是几等奖
    for k, v in rewardDict.items():
        # 这里的v是元组
        if v[0] <= num < v[1]:
            return k

# print rewardFun()
resultDict = {}

for i in range(1000):
    # res:本次转盘的等级(一/二/三等奖)
    res = rewardFun()
    if res not in resultDict:
        resultDict[res] = 1
    else:
        resultDict[res] = resultDict[res] + 1

for k, v in resultDict.items():
    print k, '---------->', v

Python函数练习题

 

5. 对于一个十进制的正整数, 定义f(n)为其各位数字的平方和,如:
    f(13) = 1**2 + 3**2 = 10
    f(207) = 2**2 + 0**2 + 7**2 = 53
    下面给出三个正整数k,a, b,你需要计算有多少个正整数n满足a<=n<=b, 且k*f(n)=n
输入:第一行包含3个正整数k,a, b, k>=1,  a,b<=10**18, a<=b;
输出:输出对应的答案;

范例:输入: 51 5000 10000
          输出: 3

Python函数练习题

def f(n):  # 13
    # 1.先把数字转换为字符串
    n = str(n)
    # 2.计算字符串中每个数的平方
    sum = 0
    for i in n:
        sum += int(i) ** 2
    return sum
print f(13)
print f(207)
# 1.接收变量
s = raw_input('请输入(k,a,b):')  # '51 5000 10000'
li = []
for item in s.split():  # ['51','5000','10000']
    li.append(int(item))
k, a, b = li
# 2.进行判断是否满足条件
count = 0
for i in range(a, b + 1):
    if k * f(i) == i:
        count += 1
print count

Python函数练习题

 

 

列表生成式部分:

6.生成一个列表,列表元素分别为[1**2,2**2,3**2,4**2...n**2]

Python函数练习题

7.找出1~10之间的所有偶数,并且返回一个列表(包含以这个偶数为半径的圆的面积)Python函数练习题

8.找出1~num之间的所有质数

Python函数练习题

 

字典生成式部分:

9.假设有20个学生,学分在60~100之间,筛选出成绩在90分以上的学生

Python函数练习题

或者:

Python函数练习题

 

10.将字典中的key值和value值调换

Python函数练习题

 

11.大小写合并,key值最终全部为小写

Python函数练习题

 

装饰器部分:

12.打印Python函数练习题如图

Python函数练习题

 

13.制作显示 login , logout , savemoney , transferMoney,分别再上下加上中秋快乐和欢迎再来

Python函数练习题

Python函数练习题

Python函数练习题

 

14.获取每个函数的执行时间

    1).函数执行前的时间
    2).函数执行后的时间

Python函数练习题

Python函数练习题

import string
import time
import random
import functools

li = [random.choice(string.ascii_letters) for i in range(100)]

def timeit(fun):
    @functools.wraps(fun)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        res = fun(*args, **kwargs)
        stop_time = time.time()
        print '运行时间为:%.6f' % (stop_time - start_time)
        return res
    return wrapper

@timeit
def con_add():
    s = ''
    for i in li:
        s += (i + ',')
    print s

@timeit
def join_add():
    print ','.join(li)

@timeit
def fun_list(n):
    """这是fun_list函数"""
    return [2 * i for i in range(n)]

@timeit
def fun_map(n):
    return list(map(lambda x: x * 2, range(n)))

con_add()
join_add()
print fun_list(5000)
print fun_map(5000)

print fun_list.__name__
print fun_list.__doc__

Python函数练习题

 

15.用户登陆验证的装饰器 is_login
    1).如果用户登陆成功,则执行被装饰的函数
    2).如果用户登陆不成功,则执行登陆函数

Python函数练习题

import functools

login_users = ['admin', 'root']

def is_login(fun):
    @functools.wraps(fun)
    def wrapper(*args, **kwargs):
        if kwargs.get('name') in login_users:
            res = fun(*args, **kwargs)
            return res
        else:
            res = login()
            return res

    return wrapper

def login():
    return '请登陆'

@is_login
def write(name):
    return '请写博客'

print write(name='admin')

Python函数练习题

 

16.创建装饰器,要求如下:
    1).创建add_log装饰器,被装饰的函数打印日志信息;
    2).日志格式为:【字符串时间】函数名:xxx,运行时间:xxx,运行返回值结果:xxx

Python函数练习题

import functools
import time

def add_log(fun):
    @functools.wraps(fun)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        res = fun(*args, **kwargs)
        end_time = time.time()
        print '[%s] 函数名:%s,运行时间:%.6f,运行返回值:%d' % (time.ctime(), fun.__name__, end_time - start_time, res)
        return res

    return wrapper

@add_log
def add(x, y):
    time.sleep(1)
    return x + y

print add(1, 2)

Python函数练习题

 

17.编写装饰器required_ints,条件如下:
    1).确保函数接收的每一个参数都是整数
    2).如果参数不是整数,打印TypeError:参数必须为整形数

Python函数练习题

import functools

def required_ints(fun):
    @functools.wraps(fun)
    def wrapper(*agrs, **kwargs):
        for i in agrs:
            if not isinstance(i, int):
                print 'TypeError:参数必须为整形数'
                break
        else:
            res = fun(*agrs, **kwargs)
            return res

    return wrapper

@required_ints
def add(a,b):
    return a + b

print add(1,2)

Python函数练习题

 

18.编写装饰器required_types,条件如下:

    1,装饰器为@required_types(int,float)确保函数接收的每一个参数都是int或者float
    2,装饰器为@required_types(list)确保函数接收到的每一个都是list类型
    3,装饰器为@required_types(str,int)确保函数接收到的每一个都是str或int类型
    4,如果参数不满足条件, TypeError:参数必须为XXX类型

Python函数练习题

import functools

def required_types(*kind):
    def types(fun):
        @functools.wraps(fun)
        def wrapper(*args, **kwargs):
            for i in args:
                if not isinstance(i, kind):
                    print 'TypeError:参数必须为', str(kind)
                    break
                else:
                    res = fun(*args, **kwargs)
                    return res

        return wrapper

    return types

@required_types(int)
def print_num(x):
    return x

print print_num(2.5)

Python函数练习题

 

19.多个装饰器,先验证是否登陆成功再验证权限

Python函数练习题

Python函数练习题

import functools
import inspect

def is_root(fun):
    @functools.wraps(fun)
    def wrapper(*args, **kwargs):
        # inspect.getcallargs返回值是字典,key值为:形参 value值为:形参对应的实参
        inspect_res = inspect.getcallargs(fun, *args, **kwargs)
        print 'inspect_res的返回值:%s' % inspect_res
        if inspect_res.get('name') == 'root':
            res = fun(*args, **kwargs)
            return res
        else:
            print 'Error:no permission'

    return wrapper

login_name = ['root', 'admin', 'redhat']

def is_login(fun):
    @functools.wraps(fun)
    def inner(*args, **kwargs):
        # *args是可变参数,args是元组类型数据
        # **kwargs是一个字典,可以传递任意多个key-value对
        if args[0] in login_name:
            res = fun(*args, **kwargs)
            return res
        else:
            print 'Error:%s未登陆' % args[0]

    return inner

@is_login
@is_root
def add_student(name):
    print '添加信息。。'

add_student('redhat')

Python函数练习题