A Byte of Python 笔记(5)函数:定义、形参、局部变量、默认参数、关键参数
第7章 函数
函数是重要的程序段。它们允许你给一块语句一个名称,然后你可以在程序的任何地方使用这个名称任意多次地运行这个语句块。这被称为 调用 函数。
定义函数
函数通过 def 关键字定义。def 关键字后跟一个函数的 标识符 名称,然后跟一对圆括号。圆括号中可以包括一些变量名,该行以冒号结尾。接下来是一块语句,它们是函数体。
# -*- coding:utf-8 –*-
# Filename: function1.py def sayHello():
print 'Hello World!!!' sayHello()

以上定义了一个名为 sayHello 的函数,该函数不使用任何参数,圆括号中没有声明任何变量。参数对于函数而言,只是给函数的输入,便于用户传递不同的值给函数,然后得到相应的结果。
函数形参
函数获取的参数即用户提供给函数的值。这些参数像变量一样,只不过这些值在用户调用函数的时候定义,而非在函数本身赋值。
参数在函数定义的圆括号内指定,用逗号分割。用户调用函数时,以同样的方式提供值。
注意:函数中的参数名称为 形参,而用户提供给函数调用的值称为 实参。
# -*- coding: utf-8 –*-
# Filename: func_param.py
def printMax(a, b):
if a > b:
print a, 'is Maximum'
else:
print b, 'is Maximum' printMax(3,4) x = 5
y = 7
printMax(x, y)

以上定义了一个名为 printMax 的函数,该函数有两个形参 a、b。
第一个 printMax 中,我们直接把数,即实参,传递给函数;
第二个 printMax 中,我们使用变量调用函数;printMax(x, y) 把实参 x 的值赋值给形参 a,实参 y 的值赋值给形参 b。
两次调用中,printMax 函数的工作完全相同。
局部变量
当用户在函数定义内声明变量的时候,它们与函数外同名的其他变量没有任何关系,即变量名称对于函数来说是 局部 的。这称为变量的 作用域 。所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始。
# -*- coding:utf-8 _*_
# Filename: func_local.py def func(x):
print 'x is', x
x = 2
print 'Changed local x to', x x = 50
print func(x)
print 'x is still', x

在函数中,我们第一次使用 x 的 值 的时候,Python 使用函数声明的形参的值。
接下来,我们把值 2 赋给 x。x 是函数的局部变量。所以,当我们在函数内改变 x 的值的时候,在主块中定义的 x 不受影响。
使用 global 语句
如果你想要为一个定义在函数外的变量赋值,那么你就得告诉 Python 这个变量名不是局部的,而是 全局的。我们使用 global 语句完成这一功能。没有 global 语句,是不可能为定义在函数外的变量赋值的。
使用 global 语句可以清楚地表明变量是在外面的块定义的。
# -*- coding: utf-8 -*-
# Filename: func_global.py def func():
global x print 'x is', x
x = 2
print 'Changed local x to', x x = 50
func()
print 'Value of x is', x

global 语句被用来声明 x 是全局的——因此,当我们在函数内把值赋给 x 的时候,这个变化也反映在我们在主块中使用 x 的值的时候。
你可以使用同一个 global 语句指定多个全局变量。例如 global x, y, z。
默认参数值
对于一些函数,用户可能希望它的一些参数是 可选 的,如果用户没有为这些参数提供值,这些参数就使用默认值。这个功能借助于默认参数值完成。你用户可以在函数定义的形参名后加上赋值运算符(=)和默认值,从而给形参指定默认参数值。
注意,默认参数值应该是一个参数。更加准确的说,默认参数值应该是不可变的。
# -*- coding: utf-8 -*-
# Filename: func_default.py def say(message, times = 1):
print message * times say('hello')
say('world', 5)

名为say的函数用来打印一个字符串任意所需的次数。如果不提供一个值,那么默认地,字符串将只被打印一遍。我们通过给形参 times 指定默认参数值 1 来实现这一功能。
在第一次使用 say 的时候,我们只提供一个字符串,函数只打印一次字符串。在第二次使用 say 的时候,我们提供了字符串和参数 5,表明我们想要 说 这个字符串消息 5 遍。
| 重要 只有在形参表末尾的那些参数可以有默认参数值,即不能在声明函数形参的时候,先声明有默认值的形参,后声明没有默认值的形参。这是因为赋给形参的值是根据位置而赋值的。 例如,def func(a, b=5)是有效的,但是def func(a=5, b)是 无效 的。 |
关键参数
如果某个函数有许多参数,而用户只想指定其中的一部分,那么可以通过 命名 来为这些参数赋值——称作 关键参数 ——使用名字(关键字)而不是位置来给函数指定实参。
优势有两个:
一,由于我们不必担心参数的顺序,使用函数变得更加简单了。
二、假设其他参数都有默认值,我们可以只给我们想要的那些参数赋值。
# -*- coding: utf-8 -*-
# Filename: func_key.py def func(a, b=5, c=10):
print 'a is', a, 'and b is', b, 'and c is', c func(3, 7)
func(25, c=24)
func(c=50, a=100)

名为 func 的函数有一个没有默认值的参数,和两个有默认值的参数。
第一次使用函数 func(3, 7) 时, 根据实参位置为 a、b 赋值,而参数 c 使用默认值10。
第二次使用函数 func(25, c=24) 时,根据实参的位置变量 a 得到值 25。根据命名,即关键参数,参数 c 得到值 24。变量 b 根据默认值,为5。
第三次使用 func(c=50, a=100) 时,使用关键参数来完全指定参数值。注意,尽管函数定义中,a 在 c 之前定义,我们仍然可以在 a 之前指定参数 c 的值。
return 语句
return 语句用来从一个函数 返回 ,即跳出函数。我们也可从函数 返回一个值 。
# -*- coding: utf-8 -*-
# Filename: func_return.py def maximum(x, y):
if x > y:
return x
else:
return y print maximum(8, 5)

注意,没有返回值的 return 语句等价于 return None。None 是 Python 中表示没有任何东西的特殊类型。例如,如果一个变量的值为 None,可以表示它没有值。
除非你提供你自己的 return 语句,每个函数都在结尾暗含有return None语句。通过运行 print someFunction(),返回 None,函数 someFunction 没有使用 return 语句,如下:
def someFunction():
pass
pass语句在Python中表示一个空的语句块。
DocStrings
Python 有一个很奇妙的特性,称为 文档字符串 ,它通常被简称为 docstrings 。DocStrings 是一个重要的工具,它可以使程序文档更加简单易懂,建议使用。你甚至可以在程序运行的时候,从函数恢复文档字符串!
# -*- coding: utf-8 -*-
# Filename: func_doc.py def printMax(x, y):
'''Prints the maximum of two numbers. The two values must be integers.''' x = int(x) # convert to integers, if possible
y = int(y) if x > y:
print x, 'is maximum'
else:
print y, 'is maximum' printMax(5, 7)
print printMax.__doc__

函数的第一个逻辑行的字符串是这个函数的 文档字符串 。注意,DocStrings也适用于模块和类。
文档字符串的惯例是一个多行字符串。首行以大写字母开始,句号结尾;第二行是空行;从第三行开始是详细的描述。 强烈建议 在函数中使用文档字符串时遵循。
DocStings 作用:抓取函数的__doc__属性,然后整洁地展示给你。
在程序中包括 help(printMax),按 q 退出 help。
自动化工具也可以以同样的方式从你的程序中提取文档。
A Byte of Python 笔记(5)函数:定义、形参、局部变量、默认参数、关键参数的更多相关文章
- Python:笔记(2)——函数与模块
Python:笔记(2)——函数与模块 Python函数 关于函数 1.我们可以使用Help来查看函数的帮助信息 2.调用函数的时候,如果传入的参数数量或者类型不符合均会报错. 3.函数名其实就是一个 ...
- python简单的函数定义和用法实例
python简单的函数定义和用法实例 这篇文章主要介绍了python简单的函数定义和用法,实例分析了Python自定义函数及其使用方法,具有一定参考借鉴价值,需要的朋友可以参考下 具体分析如下: 这里 ...
- python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程
python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...
- 第7.23节 Python使用property函数定义属性简化属性访问的代码实现
第7.23节 Python使用property函数定义属性简化属性访问的代码实现 一. 背景 在本章前面章节中,我们介绍了类相关的知识,并举例进行了说明,在这些例子中会定义一些形如 ...
- Python使用property函数定义的属性名与其他实例变量重名会怎么样?
首先如果定义的属性名与该属性对应的操作方法操作的实例对象同名就会触发无穷的递归调用,相关部分请参考<Python案例详解:使用property函数定义与实例变量同名的属性会怎样?> 但如果 ...
- Python使用property函数定义属性访问方法如果不定义fget会怎么样?
我们知道Python使用property函数定义属性访问方法时的语法如下: 实例属性=property(fget=None, fset=None, fdel=None, doc=None) 而是要@p ...
- C语言怎么给函数添加形参的默认值
以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」https://www.cnblogs.com/englyf/p/16637890.html 如果不是机缘巧合,当年转到C++ ...
- A Byte of Python 笔记(12)python 标准库:sys、os,更多内容
第14章 python 标准库 Python标准库是随Python附带安装的,它包含大量极其有用的模块. sys 模块 sys 模块包含系统对应的功能.如 sys.argv 列表包含命令行参数. # ...
- A Byte of Python 笔记(9) 面向对象编程
第11章 面向对象编程 面向过程:根据操作数据的函数或语句块来设计程序. 面向对象(OOP, object-oriented programming):把数据和功能结合起来,用对象包裹组织程序. 类 ...
随机推荐
- IOS开发:xcode5版本引发的问题
下面这段代码是用于处理ios7头部透明问题的 #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 if ( IOS7_OR_LATER ) { self.e ...
- android 内存优化
OOM 内存泄漏引起很多问题: 1:节目卡顿.反应慢(高内存使用情况JVM 虚拟机的频繁离职GC) 2:消失 3:直接崩溃 ANDROID 内存面临的问题 1: 有限的堆内存,原始仅仅有16M 2:内 ...
- 指针和Const限定符
指针和Const限定符 1.指向const对象的指针 如果指针指向的是const对象,则不允许使用指针来改变其所指的const值.C++要求指向const对象的指针具有const特性. const d ...
- oracle tns
oracle tns 是oracle提供的服务名,设置方法,oracle安装根目录---product----版本选择11.2.0----client1---NETWORK---ADMIN---tns ...
- 集合的实现 -- 数据结构与算法的javascript描述 第九章
集合 集合(set)是一种包含不同元素的数据结构. 集合中的元素称为成员. 集合的两个最重要特性是:首先,集合中的成员是无序的:其次,集合中不允许相同成员存在. code function Set() ...
- 关于HTTP 协议的特点,以及网络请求GET 和 POST 的区别?
HTTP协议有何特点: HTTP 超文本的传输协议,是短连接,是客户端主动发送请求,服务器做出响应,服务器响应之后连接断开 HTTP是属于应用层面向对象的协议,HTTP 有2类报文:请求报文和响应报文 ...
- select2插件常用方法汇总
1.获取下拉框的value和text <input type="hidden" name="xa" id="xa" data-plac ...
- 设计模式之---模板方法template method的使用
在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的.Template Method ...
- 错误提示:在此上下文中不允许使用名称 "***"。有效表达式包括常量、 常量表达式和变量(在某些上下文中),不允许使用列名。
出现这种情况的原因,是因为在SQL语句的编写格式不正确. 事例展示: 错误: string sql = "insert into person ([name], sex, salary) v ...
- COM组件简介
面向对象的思想难以适应这种分布式软件模型,于是组件化程序设计思想得到了迅速的发展. 按照组件化的程序设计的思想,复杂的应用程序被设计成一些小的,功能单一的组件模块,这些组件模块可以运行在同一台机器上, ...