首页 > 编程语言 >从零开始学Python第15课:函数的应用

从零开始学Python第15课:函数的应用

时间:2023-06-20 10:32:00浏览次数:45  
标签:return 函数 Python int 从零开始 print 15 data def


案例1

设计一个生成随机验证码的函数,验证码由数字和英文大小写字母构成,长度可以通过参数设置。

import random
import string

ALL_CHARS = string.digits + string.ascii_letters


def generate_code(*, code_len=4):
    """
    生成指定长度的验证码
    :param code_len: 验证码的长度(默认4个字符)
    :return: 由大小写英文字母和数字构成的随机验证码字符串
    """
    return ''.join(random.choices(ALL_CHARS, k=code_len))

说明1string模块的digits代表0到9的数字构成的字符串'0123456789'string模块的ascii_letters代表大小写英文字母构成的字符串'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

说明2random模块的samplechoices函数都可以实现随机抽样,sample实现无放回抽样,这意味着抽样取出的元素是不重复的;choices实现有放回抽样,这意味着可能会重复选中某些元素。这两个函数的第一个参数代表抽样的总体,而参数k代表样本容量,需要说明的是choices函数的参数k是一个命名关键字参数,在传参时必须指定参数名。

可以用下面的代码生成5组随机验证码来测试上面的函数。

for _ in range(5):
    print(generate_code())

输出:

59tZ
QKU5
izq8
IBBb
jIfX

或者

for _ in range(5):
    print(generate_code(code_len=6))

输出:

FxJucw
HS4H9G
0yyXfz
x7fohf
ReO22w

说明:我们设计的generate_code函数的参数是命名关键字参数,由于它有默认值,可以不给它传值,使用默认值4。如果需要给函数传入参数,必须指定参数名code_len

案例2

设计一个判断给定的大于1的正整数是不是质数的函数。质数是只能被1和自身整除的正整数(大于1),如果一个大于1的正整数从零开始学Python第15课:函数的应用_最小公倍数是质数,那就意味着在2到从零开始学Python第15课:函数的应用_数学建模_02之间都没有它的因子。

def is_prime(num: int) -> bool:
    """
    判断一个正整数是不是质数
    :param num: 大于1的正整数
    :return: 如果num是质数返回True,否则返回False
    """
    for i in range(2, int(num ** 0.5) + 1):
        if num % i == 0:
            return False
    return True

说明1:上面is_prime函数的参数num后面的: int用来标注参数的类型,虽然它对代码的执行结果不产生任何影响,但是很好的增强了代码的可读性。同理,参数列表后面的-> bool用来标注函数返回值的类型,它也不会对代码的执行结果产生影响,但是却让我们清楚的知道,调用函数会得到一个布尔值,要么是True,要么是False

说明2:上面的循环并不需要从2循环到从零开始学Python第15课:函数的应用_最小公倍数_03,因为如果循环进行到从零开始学Python第15课:函数的应用_最小公倍数_04时,还没有找到从零开始学Python第15课:函数的应用_开发语言_05的因子,那么从零开始学Python第15课:函数的应用_最小公倍数_04之后也不会出现从零开始学Python第15课:函数的应用_开发语言_05的因子,大家可以自己想一想这是为什么。

案例3

设计计算两个正整数最大公约数和最小公倍数的函数。从零开始学Python第15课:函数的应用_python_08从零开始学Python第15课:函数的应用_最小公倍数_09的最大公约数是能够同时整除从零开始学Python第15课:函数的应用_python_08从零开始学Python第15课:函数的应用_最小公倍数_09的最大整数,如果从零开始学Python第15课:函数的应用_python_08从零开始学Python第15课:函数的应用_最小公倍数_09互质,那么它们的最大公约数为1;从零开始学Python第15课:函数的应用_python_08从零开始学Python第15课:函数的应用_最小公倍数_09的最小公倍数是能够同时被从零开始学Python第15课:函数的应用_python_08从零开始学Python第15课:函数的应用_最小公倍数_09整除的最小正整数,如果从零开始学Python第15课:函数的应用_python_08从零开始学Python第15课:函数的应用_最小公倍数_09互质,那么它们的最小公倍数为从零开始学Python第15课:函数的应用_开发语言_20。需要提醒大家注意的是,计算最大公约数和最小公倍数是两个不同的功能,应该设计成两个函数,而不是把两个功能放到同一个函数中。

def lcm(x: int, y: int) -> int:
    """求最小公倍数"""
    return x * y // gcd(x, y)


def gcd(x: int, y: int) -> int:
    """求最大公约数"""
    while y % x != 0:
        x, y = y % x, x
    return x

说明1:函数之间可以相互调用,上面求最小公倍数的lcm函数就调用了求最大公约数的gcd函数,通过从零开始学Python第15课:函数的应用_python_21来计算最小公倍数。

说明2:上面的gcd函数使用了欧几里得算法计算最大公约数,欧几里得算法也称为辗转相除法,这个算法通常有更好的执行效率,不了解的小伙伴可以自行科普。

案例4

假设样本数据保存一个列表中,设计计算样本数据描述性统计信息的函数。描述性统计信息通常包括:算术平均值、中位数、极差(最大值和最小值的差)、方差、标准差、变异系数等,计算公式如下所示:

样本均值(sample mean):
从零开始学Python第15课:函数的应用_数学建模_22
样本方差(sample variance):
从零开始学Python第15课:函数的应用_最大公约数_23
样本标准差(sample standard deviation):
从零开始学Python第15课:函数的应用_python_24
变异系数(coefficient of sample variation):
从零开始学Python第15课:函数的应用_数学建模_25

def ptp(data):
    """极差(全距)"""
    return max(data) - min(data)


def mean(data):
    """算术平均"""
    return sum(data) / len(data)


def median(data):
    """中位数"""
    temp, size = sorted(data), len(data)
    if size % 2 != 0:
        return temp[size // 2]
    else:
        return mean(temp[size // 2 - 1:size // 2 + 1])


def var(data, ddof=1):
    """方差"""
    x_bar = mean(data)
    temp = [(num - x_bar) ** 2 for num in data]
    return sum(temp) / (len(temp) - ddof)


def std(data, ddof=1):
    """标准差"""
    return var(data, ddof) ** 0.5


def cv(data, ddof=1):
    """变异系数"""
    return std(data, ddof) / mean(data)


def describe(data):
    """输出描述性统计信息"""
    print(f'均值: {mean(data)}')
    print(f'中位数: {median(data)}')
    print(f'极差: {ptp(data)}')
    print(f'方差: {var(data)}')
    print(f'标准差: {std(data)}')
    print(f'变异系数: {cv(data)}')

说明1:中位数是将数据按照升序或降序排列后位于中间的数,它描述了数据的中等水平。中位数的计算分两种情况:当数据体量从零开始学Python第15课:函数的应用_开发语言_26为奇数时,中位数是位于从零开始学Python第15课:函数的应用_最大公约数_27位置的元素;当数据体量从零开始学Python第15课:函数的应用_开发语言_26为偶数时,中位数是位于从零开始学Python第15课:函数的应用_数学建模_29从零开始学Python第15课:函数的应用_最大公约数_30两个位置元素的均值。

说明2:计算方差和标准差的函数中有一个名为ddof的参数,它代表了可以调整的自由度,默认值为1。在计算样本方差和样本标准差时,需要进行自由度校正;如果要计算总体方差和总体标准差,可以将ddof参数赋值为0,即不需要进行自由度校正。

说明3describe函数将上面封装好的统计函数组装到一起,用于输出数据的描述性统计信息。事实上,Python 标准库中有一个名为statistics的模块,它已经把获取描述性统计信息的函数封装好了,有兴趣的读者可以自行了解。

案例5

我们用函数重构之前讲过的双色球随机选号的例子(《第09课:常用数据结构之列表-2》),将生成随机号码和输出一组号码的功能分别封装到两个函数中,然后通过调用函数实现机选N注号码的功能。

"""
双色球随机选号程序

Author: 骆昊
Version: 1.3
"""
import random

RED_BALLS = [i for i in range(1, 34)]
BLUE_BALLS = [i for i in range(1, 17)]


def choose():
    """
    生成一组随机号码
    :return: 保存随机号码的列表
    """
    selected_balls = random.sample(RED_BALLS, 6)
    selected_balls.sort()
    selected_balls.append(random.choice(BLUE_BALLS))
    return selected_balls


def display(balls):
    """
    格式输出一组号码
    :param balls: 保存随机号码的列表
    """
    for ball in balls[:-1]:
        print(f'\033[031m{ball:0>2d}\033[0m', end=' ')
    print(f'\033[034m{balls[-1]:0>2d}\033[0m')


n = int(input('生成几注号码: '))
for _ in range(n):
    display(choose())

说明:大家看看display(choose())这行代码,这里我们先通过choose函数获得一组随机号码,然后把choose函数的返回值作为display函数的参数,通过display函数将选中的随机号码显示出来。重构之后的代码逻辑非常清晰,代码的可读性更强了。如果有人为你封装了这两个函数,你仅仅是函数的调用者,其实你根本不用关心choose函数和display函数的内部实现,你只需要知道调用choose函数可以生成一组随机号码,而调用display函数传入一个列表,就可以输出这组号码。将来我们使用各种各样的 Python 三方库时,我们也根本不关注它们的底层实现,我们需要知道的仅仅是调用哪个函数可以解决问题。

总结

在写代码尤其是开发商业项目的时候,一定要有意识的将相对独立且重复使用的功能封装成函数,这样不管是自己还是团队的其他成员都可以通过调用函数的方式来使用这些功能,减少工作中那些重复且乏味的劳动。


标签:return,函数,Python,int,从零开始,print,15,data,def
From: https://blog.51cto.com/u_16166070/6520948

相关文章

  • Python开发系列课程(8) - 字符串和常用数据结构
    字符串和常用数据结构使用字符串第二次世界大战促使了现代电子计算机的诞生,当初的想法很简单,就是用计算机来计算导弹的弹道,因此在计算机刚刚诞生的那个年代,计算机处理的信息主要是数值,而世界上的第一台电子计算机ENIAC每秒钟能够完成约5000次浮点运算。随着时间的推移,虽然对数值运......
  • Python开发系列课程(4) - 循环结构
    循环结构循环结构的应用场景如果在程序中我们需要重复的执行某条或某些指令,例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向奔跑的指令。当然你可能已经注意到了,刚才的描述中其实不仅仅有需要重复的动作,还有我们上一个章节......
  • 实现高词频的统计以及文件的操作(python_jieba分词)
    Requestsjieba分词应用:使用jieba分词对一个文本进行分词,将分词结果保存于文件“fc.txt”中,注意结果只保存有效词语,单字不保存。并统计在文章中出现次数最多的前五个词语(一个字的不算词语)。(问题来源:旺财的python作业)Text董卓进京后,废立皇帝,残害百姓,荒淫暴虐,激起群臣共愤。一日,......
  • P1582 倒水(C++_数论_进制)
    题目描述一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水。接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子。每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃。(不能丢弃有水的瓶子)显然在某些情况下CC无法达到目标,比......
  • Python和c语言爬虫如何选择?
    Python是最受欢迎的爬虫语言之一,因为它易于学习和使用,有大量的库和框架可供选择。JavaScript通常用于Web爬虫,因为它可以直接在浏览器中运行,可以轻松地从动态网站中提取数据。java是一种广泛使用的语言,它有很多强大的库和框架,可以用于爬虫。具体用哪个语言做爬虫完全取决于你的项目......
  • python编程规范之函数变量定义规范
    我们经常能看到一些人写代码是这样的:defmy_function():print(my_variable)my_variable=10my_function()在这种情况下,代码将正常运行并输出变量的值为10。当你在函数内部引用一个变量时,Python首先会查找函数内部是否定义了该变量。如果没有找到,它会继续查找函数外......
  • Loop or Iterate over all or certain columns of a dataframe in Python-pandas 遍历
    Inthisarticle,wewilldiscusshowtolooporIterateoverallorcertaincolumnsofaDataFrame?Therearevariousmethodstoachievethistask.Let’sfirstcreateaDataframeandseethat: Code:  Python3  #importpandaspackageim......
  • Python爬虫需要那些步骤 ?
    Python爬虫是一种自动化程序,可以通过网络爬取网页上的数据。Python爬虫可以用于各种用途,例如数据挖掘、搜索引擎优化、市场研究等。Python爬虫通常使用第三方库,例如BeautifulSoup、Scrapy、Requests等,这些库可以帮助开发者轻松地获取网页上的数据。Python爬虫的工作原理是通过HTTP......
  • CMU15445 (Fall 2020) 数据库系统 Project#4 - Concurrency Control 详解
    前言一个合格的事务处理系统,应该具备四个性质:原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。隔离性保证了一个活跃的事务(还没提交或者回滚)对数据库所做的系统对于其他的活跃事务是不可见的,看起来就像某一时刻就只有一个事务在操作数据库。然而完美的......
  • python: draw
     #-*-coding:utf-8-*-#pipinstallpygame"""DrawTool.py画板"""importmathimportpygamefrompygame.localsimportQUIT,KEYDOWN,K_ESCAPE,MOUSEBUTTONDOWN,MOUSEMOTION,MOUSEBUTTONUP#导入事件classBrush(object):......