定义函数

我们通过斐波那契数列来理解定义函数>>> def fib(n):    # 将斐波那契数列打印到 n

...     """将斐波那契数列打印到 n"""

...     a, b = 0, 1

...     while a

...         print(a, end=' ')

...         a, b = b, a+b

...     print()

...

>>> # 调用上面定义的函数

... fib(2000)

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

关键字 def 引入了一个函数定义 。其后面必须跟随有函数的名称以及用括号包起来的一系列参数。构成函数体的语句从下一行开始,并且必须缩进。

函数体的第一个语句可以是一个字符串常量,这个字符串常量就是这个函数的文档字符串,或者说是 docstring ,有很多工具可以用于在线或者可打印文档的自动化生成,或者可以让用户交互地在代码中浏览文档;在代码中写文档字符串是比较好的实践,所以请养成写文档字符串的习惯。

函数的执行引入了一个新的符号表用于存储函数的局部变量。更准确地说,在函数内的所有变量赋值都会被存储到这张局部符号表中;所以在查找一个变量的引用时,会先查找局部符号表,然后查找闭包函数的局部符号表,接着是全局符号表,最后才是内置名称表。因此,尽管可能在函数中引用全局变量,但在函数中无法对全局变量直接进行赋值(除非用 global 语句来定义一个变量)

当一个函数被调用时,函数参数被引入到局部符号表中;因此,参数是通过 按值传递 的方式来传递的(这个值表示一个对象的 引用 ,而不是该对象的值)。[1] 当在一个函数中调用另外一个函数时,将会为这次调用创建一个新的局部符号表。

一个函数定义将会在当前符号表中引入函数的名称。这个函数的名称对应的值的类型会被解释器解释为用户定义的函数。这个值可以被赋值给另外一个名称,并且将这名称可以当作一个函数来使用。这是一种常用的重命名机制:>>> fib

>>> f = fib

>>> f(100)

0 1 1 2 3 5 8 13 21 34 55 89

默认参数值

最常用的形式是为一个或多个参数指定默认值。这样,函数可以以少于其定义的参数被调用。比如:def ask_ok(prompt, retries=4, reminder='Please try again!'):

while True:

ok = input(prompt)

if ok in ('y', 'ye', 'yes'):

return True

if ok in ('n', 'no', 'nop', 'nope'):

return False

retries = retries - 1

if retries

raise ValueError('invalid user response')

print(reminder)

该函数可以有几种不同的调用方式:

只指定强制的参数

参数: ask_ok('Do you really want to quit?')

提供一个可选参数

参数: ask_ok('OK to overwrite the file?', 2)

或者给定全部的参数

参数: ask_ok('OK to overwrite the file?', 2, 'Come on, onlyyes or no!')

上述例子顺便也提及了 in 关键字。它是用来测试某个特定值是否在一个序列中。

默认值是在定义函数时的 “定义过程中” (defining )的范围内评估的(函数参数默认值是个变量的话,要根据函数定义前变量的值来确定参数默认值), 所以,i = 5

def f(arg=i):

print(arg)

i = 6

f()

会打印 5.

关键字参数

形如 kwarg=value 形式的参数是 关键字参数。例如,以下函数:def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):

print("-- This parrot wouldn't", action, end=' ')

print("if you put", voltage, "volts through it.")

print("-- Lovely plumage, the", type)

print("-- It's", state, "!")

接收一个必选参数 (voltage ) 和三个可选参数( state,action, 和 type )。这个函数下方式调用:parrot(1000)                                          # 一个位置参数

parrot(voltage=1000)                                  # 一个关键字参数

parrot(voltage=1000000, action='VOOOOOM')             # 2个关键字参数

parrot(action='VOOOOOM', voltage=1000000)             # 2个关键字参数

parrot('a million', 'bereft of life', 'jump')         # 3个位置参数

parrot('a thousand', state='pushing up the daisies')  # 一个位置参数,一个关键字参数

但是下列的所有调用方式都是无效的:parrot()                     # 必选参数缺失

parrot(voltage=5.0, 'dead')  # 非关键字参数在关键字参数后面

parrot(110, voltage=220)     # 同一参数重复赋值

parrot(actor='John Cleese')  # 未知关键字参数

在函数调用中,关键字参数必须遵循参数位置。传递的所有关键字参数必须跟函数接受的其中一个参数相匹配。(例如: actor 在函数 parrot 中不是一个有效的参数),并且它们的顺序并不重要。这同样也包括那些非必选参数 (例如 parrot(voltage=1000) 同样有效)。没有参数可能多次获取一个值。下例就是因此而失败的:>>> def function(a):

...     pass

...

>>> function(0, a=0)

Traceback (most recent call last):

File "", line 1, in

TypeError: function() got multiple values for keyword argument 'a'

当最后存在 **name 形式的参数时,它最后会接收一个字典,(参见 Mapping Types --- dict) 包含所有除了和形式参数相对应的关键字参数。这可以与 * name 形式的形式参数(在下一小节中描述)结合,该参数接收包含正式参数列表之外的位置参数的元组。 (*name 必须出现在 **name 之前。) 例如,我们如果定义一个如下函数:def cheeseshop(kind, *arguments, **keywords):

print("-- Do you have any", kind, "?")

print("-- I'm sorry, we're all out of", kind)

for arg in arguments:

print(arg)

print("-" * 40)

for kw in keywords:

print(kw, ":", keywords[kw])

它可以像这样调用:cheeseshop("Limburger", "It's very runny, sir.",

"It's really very, VERY runny, sir.",

shopkeeper="Michael Palin",

client="John Cleese",

sketch="Cheese Shop Sketch")

可变参数

最后,最不常用的指定参数的选项是可变数量的参数。这些参数将被组装成一个元组 (参见  元组和序列) 。在可变参数之前,可能会出现零个或多个正常参数。def write_multiple_items(file, separator, *args):

file.write(separator.join(args))

分离参数列表

当输入的参数已经是列表或元组形式而为了调用其中单独的位置参数时,将会出现与上面相反的情况。例如内置函数 range() 需要有独立的 start 和 stop 参数。如果输入的时候不是独立的参数,则需要用 * 操作符来将参数从列表或者元组里面提取出来:>>> list(range(3, 6))            # 正常利用参数调用函数

[3, 4, 5]

>>> args = [3, 6]

>>> list(range(*args))            # 从列表中提取参数来调用函数

[3, 4, 5]

Lambda 表达式

我们可以使用 lambda关键字来创建小型匿名函数。此函数会返回其两个参数的和:lambda a,b:a + b。可以在任何需要函数对象的场合使用 Lambda 函数。它们在语法上仅限于单个表达式。从语义上讲,它们只是普通函数定义的语法糖。与嵌套函数定义类似,lambda 函数可以从包含它的上下文中引用变量:>>> def make_incrementor(n):

...     return lambda x: x + n

...

>>> f = make_incrementor(42)

>>> f(0)

42

>>> f(1)

4

python函数详细讲解_小白必看的Python函数讲解相关推荐

  1. 51自学网python爬虫_小白必看的Python爬虫流程

    定义: 网络爬虫(Web Spider),又被称为网页蜘蛛,是一种按照一定的规则,自动地抓取网站信息的程序或者脚本. 简介: 网络蜘蛛是一个很形象的名字.如果把互联网比喻成一个蜘蛛网,那么Spider ...

  2. python删除文件夹无法访问_零基础小白必看:python基本操作-文件、目录及路径

    使用python的os模块,简单方便完成对文件夹.文件及路径的管理与访问操作. 1 前言 在最近开发中,经常需要对文件进行读取.遍历.修改等操作,想要快速.简单的完成这些操作,我选择用 python ...

  3. python目录及文件_零基础小白必看:python基本操作-文件、目录及路径

    1 前言 在最近开发中,经常需要对文件进行读取.遍历.修改等操作,想要快速.简单的完成这些操作,我选择用 python .通过 python 的标准内置 os 模块,只需要几行代码,即可完成想要的操作 ...

  4. python到底可以做什么-编程小白必看!Python到底能做什么?

    Python编程语言的入门门槛低,它的可读性强,代码简单易懂,尽管同样是使用C语言编写,但它又摒弃了C语言中复杂的指针,极大程度的简化Python的语法.对于初学者而言,学习Python不仅仅入门容易 ...

  5. python find(urlopen.read())_Python小白必看之urlopen()详解

    一.  简介 urllib.request.urlopen()函数用于实现对目标url的访问. 函数原型如下:urllib.request.urlopen(url, data=None, [timeo ...

  6. python编程是干嘛的-编程小白必看!Python到底能做什么?

    Python编程语言的入门门槛低,它的可读性强,代码简单易懂,尽管同样是使用C语言编写,但它又摒弃了C语言中复杂的指针,极大程度的简化Python的语法.对于初学者而言,学习Python不仅仅入门容易 ...

  7. Python网络爬虫入门篇---小白必看

    1.  预备知识 学习者需要预先掌握Python的数字类型.字符串类型.分支.循环.函数.列表类型.字典类型.文件和第三方库使用等概念和编程方法. 2. Python爬虫基本流程 a. 发送请求 使用 ...

  8. anaconda如何卸载库_小白必看!Anaconda安装全攻略

    本文作者:戴    雯文字编辑:方    言技术总编:张馨月 爬虫俱乐部云端课程来袭! 爬虫俱乐部将于2020年8月25日至28日在线上举行Stata数据分析法律与制度专题训练营,主要是为了让学员掌握 ...

  9. 如何在 Python 中开始机器学习?(小白必看)

    其实学习机器学习的最好方法是设计和完成小项目. Python 是一种流行且功能强大的解释型语言.与 R 不同,Python 是一种完整的语言和平台,可用于研究和开发以及开发生产系统. 还有很多模块和库 ...

  10. python撩妹技能_干货必看 | 手把手教你用Python撩妹

    今天我们不讲专业知识,我们来讲讲,如何用Python做个撩妹小程序,考虑到有些小白没有深入的学习过Python,我给大家整理个初阶小白也可以做出来的程序,画颗爱心. 以下是代码: 1 from tur ...

最新文章

  1. 什么是整型?Python整型详细介绍
  2. ckedit 文本编辑器
  3. python线程执行带有参数的任务(args、kwargs)
  4. ZooKeeper的API操作(二)(通俗易懂)
  5. java获取vdx文件数据_通过文件名获取文件类型ContentType
  6. python查看函数定义_从函数内函数定义看python的函数实现
  7. python easy install_Python 安装easy_install详解
  8. Spring中@Resource与@Autowired、@Qualifier的用法与区别
  9. xfce中鼠标的“反转卷轴方向“
  10. 如何检测 SAP 电商云 Spartacus UI 当前正处于导航状态
  11. 某一年某一年_过去一年里有关开放式组织的5个最受欢迎的故事
  12. python伪造邮件发件地址_Python:向多个地址发送电子邮件
  13. JProfiler11安装,选择IDE
  14. matlab的基本语法规则_MATLAB基础语法
  15. javascript实现国密SM4
  16. 如何查找Steam好友代码(以及添加好友代码)
  17. 2020.12.28用isprime函数判断m是否为素数
  18. 去雨去雾的研究和可用方法
  19. 全国24省50万亿元投资在路上:后疫情时代碰撞新基建,AI难再“一招鲜”
  20. Emacs_HotKey

热门文章

  1. IDEA社区版利用maven创建web
  2. 嵌入式系统开发的模式与流程
  3. Linux设置 鼠标滚轮方向,如何在Ubuntu中反转鼠标滚动方向(又名自然滚动) | MOS86...
  4. 通过ip查找域名的网站
  5. Finance reading list(Mar.2019,by Stephen Nie)
  6. Qt游戏编程——飞机大战——补充
  7. oracle alter database,alter database操作
  8. 计算机网络密码用户名是什么,宽带连接的用户名和密码是什么
  9. 蜂窝移动网络是什么?它和Wi-Fi有什么区别?
  10. 中国象棋人工智能实现