详解Python模块化编程-自定义函数

 
 

07cce3cfed9c341a650a3a7cf0cbf1aa.gif

 
 
公众号后台回复“图书“,了解更多号主新书内容

     作者:pythonic生物人

     来源:pythonic生物人

本文目录

0、楔子
1、自定义函数格式
2、编写函数说明文档
3、函数参数
  函数形参和实参区别
  位置实参
  关键字实参
  默认实参
  让实参可选
  传递任意数量的实参
  结合使用位置实参和任意数量实参
  使用任意数量的关键字实参
4、函数返回值
  将函数存储在模块中并导入新程序中

正文开始啦

0、楔子

函数可以理解为多条语句整合而成的代码块,指定特定的名称, 用于实现具体的功能。函数可以实现代码更好的复用,是结构化编程的核心。例如,已知圆的半径r求圆的面积,可以通过如下代码解决。

import math
r = 3
S = math.pi*r*r
print(S)

28.274333882308138

但是,当需要求多个圆的面积时,反复写上面代码就显得很繁琐,这时可以定义一个求圆面积的函数s_circle,每次只需传入不同圆的半径,即可计算不同圆面积。

def s_circle(r):
    S = math.pi*r*r
    return S
print(s_circle(3))
print(s_circle(333))

28.274333882308138

348368.06776391855


1、 自定义函数格式

格式如下:

def fun_name(args):
    fun_body
    return xx

fun_name,自定义的函数名;
args,传入函数的参数;
fun_body,函数体,即函数想实现的功能;
return xx,return结束函数,函数返回值 xx,不指定则返回None。

举个栗子,定义一个计算圆面积的函数:

def s_circle(r):#自定义函数s_circle,传入的参数r。
    S = math.pi*r*r#函数体
    return S    #返回圆的面积S
print(s_circle(3))#函数名()调用函数,括号内为传入

28.274333882308138

当函数体只有一行时,可以置于def语句同一行。

def for_multi(x,y): print(x*y)#函数定义
for_multi(10,12)#调用函数

120


2、编写函数说明文档

说明文档置于函数开头处,作为函数的一部分存储起来,通过函数名.__doc__可查看说明文档。

def s_circle(r):
    "compute the circular area with radius"#函数说明文档内容
    S = math.pi*r*r
    return S
s_circle.__doc__#函数__doc__属性存储函数说明文档

'compute the circular area with radius'


3、函数参数

形参和实参区别

  • 形参:定义函数时,函数名称后面括号里的内容为形参;

  • 实参:调用函数时,括号里的内容为实参。

def hello2sb(sb):#括号内为传入的参数,此处sb为形参。
     print("Hello %s!"%sb.title())
hello2sb("jack") #此处jack为调用hello2sb的实参,是调用函数时传递给函数的信息。

Hello Jack!

位置实参

调用函数时按照形参的顺序关联实参。

def des_sb(name,provice):
    """describe sb"""
    print("%s comes from %s."%(name.title(),provice.title()))
#title函数返回标题化字符,单词的开头为大写,其余为小写
des_sb("cao","anhui")

Cao comes from Anhui.

关键字实参

形参=实参传递参数,无需考虑实参顺序。

def des_sb(name,provice):
    """describe sb"""
    print("%s comes from %s."%(name.title(),provice.title()))
#无需考虑输入实参顺序,以下两种输出一样
des_sb(name = "cao",provice = "anhui")
des_sb(provice = "anhui",name = "cao")#颠倒实参顺序

Cao comes from Anhui.

Cao comes from Anhui.

默认实参

定义函数时,给形参一个默认值,调用函数时若提供了实参则使用提供值,否则使用默认值。

def des_sb(name,provice,dynasty="Three Kingdoms Era"):#定义时形参dynasty指定默认值
    """describe sb"""
    print("%s comes from %s of %s."%(name.title(),provice.title(),dynasty))
des_sb(name = "cao",provice = "anhui")#形参此处未指定实参,调用默认值
des_sb(name = "cao",provice = "anhui",dynasty = "Qin")#dynasty指定实参,使用实参

Cao comes from Anhui of Three Kingdoms Era.

Cao comes from Anhui of Qin.

**注意:**以上三种参数传递方式可以混用,自己最容易理解的调用方式即可。

让实参可选

指定形参默认值为空字符串,放到所有形参最后,则该形参可空(可以提供实参也可以不用)。

def return_fullname(firstname,lastname,middlename=""):
    """Show fullname"""
    if middlename:
        fullname = " ".join((middlename.title()+""+lastname,firstname.title()))
    else:
        fullname = " ".join((lastname.title(),firstname.title()))
    return fullname#返回fullname
#调用函数
fullname = return_fullname(firstname = "cao",lastname = "cao")#middlename形参为空
fullname1 = return_fullname(firstname = "cao",middlename = "meng",lastname = "de")
print(fullname)
print(fullname1)

Cao Cao

Mengde Cao

传递任意数量的实参

定义函数时使用:*形参名称。

def known_tangera(*heros):#星号(*)使得Python将所有实参存入heros元组中
    """show known heros in tang"""
    print(heros)
known_tangera("yuanba li","shiming li")
known_tangera("yuanba li","shiming li","cheng nuo")

('yuba li', 'shiming li')

('yuba li', 'shiming li', 'cheng nuo')

结合使用位置实参和任意数量实参

在函数定义中将接纳任意数量实参的形参(*形参名)放在最后.。

def make_pizza(size, *toppings):
    """概述要制作的比萨"""
    print("\nMaking a " + str(size) + "-inch pizza with the following toppings:")
    for topping in toppings:#toppings元组存储任意数量的实参
        print("- " + topping)
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

Making a 16-inch pizza with the following toppings:

- pepperoni

Making a 12-inch pizza with the following toppings:

- mushrooms -

- green peppers

- extra cheese

使用任意数量的关键字实参

定义函数时使用:**形参名称。

def build_profile(first, last, **user_info):
    #形参**user_info 中的两个星号让Python创建一个名为user_info 的空字典, 
    #并将收到的所有名称—值对都封装到这个字典中。
    """创建一个字典, 其中包含我们知道的有关用户的一切"""
    profile = {}
    profile['first_name'] = first
    profile['last_name'] = last
    for key, value in user_info.items():
        profile[key] = value
    return profile
#传递
user_profile = build_profile('albert', 'einstein',
                             location='princeton',
                             field='physics')
print(user_profile)

{'first_name': 'albert', 'last_name': 'einstein', 'location': 'princeton', 'field': 'physics'}


4、函数返回值

在函数中, 可使用return 语句将值返回到调用函数的代码行。

将函数存储在模块中并导入新程序中

将函数存储在被称为模块的独立文件(模块可以理解为以.py结尾的文件)中,再将模块导入到主程序中。import 语句允许在当前运行的程序文件中使用模块中的代码。导入模块的方法有多种, 下面对每种都作简要的介绍

  • 导入整个模块

下面创建pizza模块,pizza.py:

def make_pizza(size, *toppings):
    """概述要制作的比萨"""
    print("\nMaking a " + str(size) +
          "-inch pizza with the following toppings:")
    for topping in toppings:
        print("- " + topping)
  • 在pizza.py所在的目录中创建另一个名为making_pizzas.py的模块:

import pizza#导入pizza模块
#让Python打开文件pizza.py,并将其中的所有函数都复制到这个程序中。
#本程序可以使用pizza.py中定义的所有函数。
pizza.make_pizza(16, 'pepperoni')#调用pizza模块中make_pizza函数
pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

Making a 16-inch pizza with the following toppings:

- pepperoni

Making a 12-inch pizza with the following toppings:

- mushrooms

- green peppers

- extra cheese

  • 导入模块特定的函数

#从module_name模块中导入任意数量函数,函数之间逗号分割。

from module_name import function_0, function_1, function_2

making_pizzas.py

from pizza import make_pizza#只导入pizza模块中的make_pizza函数
make_pizza(16, 'pepperoni')#调用pizza模块中make_pizza函数
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
  • 导入模块中的所有函数

使用星号(* ) 运算符可让Python导入模块中的所有函数。

from pizza import *#导入pizza模块所有函数
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
  • 使用as 给函数指定别名

from pizza import make_pizza as mp#函数别名mp
mp(16, 'pepperoni')
mp(12, 'mushrooms', 'green peppers', 'extra cheese')
  • 使用as 给模块指定别名

import pizza as p#模块别名p
p.make_pizza(16, 'pepperoni')
p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese'

参考:Python编程:从入门到实践Python基础教程(第3版)

◆ ◆ ◆  ◆ ◆
麟哥新书已经在当当上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前当当正在举行活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:
 
 
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。

管理员二维码:


猜你喜欢

● 卧槽!原来爬取B站弹幕这么简单
● 厉害了!麟哥新书登顶京东销量排行榜!
● 笑死人不偿命的知乎沙雕问题排行榜

● 用Python扒出B站那些“惊为天人”的阿婆主!
● 你相信逛B站也能学编程吗
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值