一、函数介绍

函数定义:函数时组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

我们已经知道python提供了许多内建函数,print(), type()等。我们也可以自己创建函数,这被叫做用户自定的函数。

定义一个函数

定义是遵守的简单的规则:

  • def关键字开头,后接函数标识符名称和圆括号(),然后以冒号:结尾(第一行也叫函数头)

  • 圆括号中放入参数名(形参),如果没有,可以留空

  • 函数头的下一行,缩进4个空格,开始写函数体

  • 函数体中可以有return [表达式]语句,返回一个值给调用者,如果没有return语句,默认返回None

一个自定义函数实例:

# 打印两次传入的变量的值
# 此函数没有return语句,返回None给调用者
def print_twice(name): #函数头 形参:name
print('你好', name) #函数体
print('你好', name)

定义一个函数会创建一个函数对象(function object),其类型是funtion:

print(print_twice)
print(type(print_twice)) #输出结果:
<function print_twice at 0x10217df28>
<class 'function'>

函数调用:

调用方式,函数名(),如果函数有参数,将实际参数(实参)放入括号中。

print_twice('jason')
#输出结果
你好 jason
你好 jason #使用一个变量接收函数返回值
r = print_twice('jason')
print(r)
#输出结果
你好 jason
你好 jason
None

执行流程

#py文件中代码如下,我们来分析下具体的执行流程
def print_twice(name):
print('你好', name)
print('你好', name) r = print_twice('jason')
print(r)
print('这是其他代码块')

请记住, 程序的执行流程总是从第一条语句开始, 自顶向下, 每次执行一条语句.

以上代码执行流程如下:

第一句, 定义一个函数, 但是函数体是不会执行的, 只有当函数被调用时, 才执行函数中的函数体.

然后, 到r = print_twice('jason')语句, 调用自定义函数print_twice, 这时会执行函数体, 即内部的打印语句.

然后, 到print(r)语句, 打印变量r, 由于函数没有return语句, 所以r的值为None,打印None.

最后, 执行最后一条print语句, 此py程序文件执行完毕.

注意: 函数不被调用的话, 函数内部的语句是不会被执行的.

二、函数中的参数类型

Python函数中的参数类型:

  • 位置参数

  • 不定长参数

  • 默认参数

  • 关键字参数

位置参数

位置参数必须以正确的顺序传入参数. 调用函数时给定参数的数量必须和声明时的一样.

def print_greeting(greeting, name):
print('%s, %s' %(greeting, name)) print_greeting('hello', 'jason')
# 运行结果
hello, jason # 如果调用时给的参数不足
print_greeting('hello')
# 报错
TypeError: print_greeting() missing 1 required positional argument: 'name'

关键字参数

定义的函数参数较少时, 我们通过位置传参还可以接受; 如果定义的函数参数很多, 我们不仅要记住有哪些参数, 而且还要记住每个参数的位置, 否则, 函数就不能正常调用. Python提出了一种叫做关键字参数, 不需要记住每个参数的位置, 只需要记住参数的名字就可以了.

def print_greeting(greeting, name):
print('%s, %s' %(greeting, name)) print_greeting(greeting='hello', name='jack')
# 运行结果
hello, jack

默认参数

调用函数时,如果没有传递参数,则会使用参数的默认值。

def print_greeting(greeting, name='world'):
print('%s, %s' %(greeting, name)) print_greeting(greeting='hello')
# 运行结果
hello, world print_greeting(greeting='hi', name='snow')
# 运行结果
hi, snow

不定长参数

你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数, 声明时不会命名

def printinfo( arg1, *vartuple ):
"打印任何传入的参数"
print ("输出: ")
print (arg1)
print (vartuple) # 调用printinfo 函数
printinfo( 70, 60, 50 ) # 运行结果
70
(60, 50) # 加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。

还有一种就是参数带两个星号. 加了两个星号 ** 的参数会以字典的形式导入。

def printinfo( arg1, **vardict ):
"打印任何传入的参数"
print ("输出: ")
print (arg1)
print (vardict) # 调用printinfo 函数
printinfo(1, a=2,b=3) # 运行结果
1
{'a': 2, 'b': 3}

以上四种参数类型, 定义函数时, 可以混合出现.

注意:

在使用混合参数时, 关键字参数必须在位置参数后面; 定义函数时, 必须先声明位置参数, 才能声明默认值参数.

三、变量作用域

局部作用域: 函数内部定义的或者在代码块中的变量

全局作用域: 直接在py文件中, 函数外定义的变量 + 内置命名空间

可以使用globals()查看全局命名空间; 使用locals()查看局部命名空间

局部变量使用:

# No.1
num = 100
def func():
num = 50
print('local_num:', num)
func()
print('global_num:', num)
#输出:
local_num: 50
global_num: 100 # No.2
num = 100
def func():
print('num:', num) # 使用的是全局变量
func()
print('global_num:', num)
#输出
num: 100
global_num: 100 # No.3
num = 100
def func():
num = num + 10 # 在局部未定义num
print('num:', num)
func()
print('global_num:', num)
# 输出 运行会报错
UnboundLocalError: local variable 'num' referenced before assignment(大概意思是在局部未定义就直接引用) # No.4
num = 100
def func():
global num # 在局部如果想改变全局变量, 需使用global关键字先引入变量
num = num + 10
print('num:', num)
func()
print('global_num:', num)
# 输出
num: 110
global_num: 110 # No.5 nonlocal关键字
num = 100
def func():
num = 50 # 此处如果没有定义num, 即使有全局变量num, 内层函数func2也无法使用nonlocal num语句
print('num:', num)
def func2():
nonlocal num # 向上层(上级)寻找num变量, 知道找到为止; 但是不会找到全局变量处
num = num + 10
print('num:', num)
func2()
func()
# 输出
num: 50
num: 60

总结:

  1. 优先读取函数内变量, 如果没有找到, 再去找全局变量

  2. 局部变量与全局变量同名, 局部变量重新声明赋值, 对全局变量没有影响

  3. 如果在函数内想改变全局变量, 需先使用global关键字引入该变量

相关名词定义:

a. 全局变量:在模块内、在所有函数外面、在class外面,这就是全局变量

b. 局部变量:在函数内、在class的方法内(未加self修饰的),这就是局部变量

c. 静态变量:在class内的,但不在class的方法内的,这就是静态变量

d. 实例变量:在class的方法内的,用self修饰的变量,这就是实例变量

Python学习-函数,函数参数,作用域的更多相关文章

  1. python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程

    python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...

  2. python学习8—函数之高阶函数与内置函数

    python学习8—函数之高阶函数与内置函数 1. 高阶函数 a. map()函数 对第二个输入的参数进行第一个输入的参数指定的操作.map()函数的返回值是一个迭代器,只可以迭代一次,迭代过后会被释 ...

  3. python学习day10 函数Ⅱ(参数&作用域)

    函数Ⅱ(参数&作用域) 知识小结: py2与py3的区别 逻辑运算()>not>and>or 字符串翻转切片翻转 is与==区别 git相关 数据类型判断 操作系统:cent ...

  4. python学习Day12 函数的默认值、三元表达式、函数对象(函数名)的应用场景、名称空间与作用域

    复习 1.字符串的比较: -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 2. 函数的参数 : 1)实参与形参:       -- 形参:在函数定义时()中出现的参数       ...

  5. Python学习之函数参数

    上一节,我们学习了Python中是如何定义和调用函数且如何得到返回值的.在调用函数时,有的函数需要参数来启动函数,有的则无需参数.这一节我们来介绍Python中有哪些参数类型. 位置参数 在调用函数时 ...

  6. Python学习笔记 - 函数参数

    >>> def power(x): ... return x * x ... >>> power(5) 25 >>> def power(x, n ...

  7. 04 python学习笔记-函数、函数参数和返回值(四)

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print(),我们也可以自己创建函数,这叫做用户自定 ...

  8. python学习Day11 函数的参数列表

    复习 什么是函数? 具体特定功能的代码块 - 特定功能代码作为一个整体,并给该整体命名,就是函数 函数的优点 : 1.减少代码的冗余,2.结构清晰,可读性强 3.具有复用性,开发效率高,维护成本高 如 ...

  9. Python学习--05函数

    Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.我们已经知道Python提供了许多内建函数,比如print().但我们 ...

  10. python学习总结(函数进阶)

    -------------------程序运行原理------------------- 1.模块的内建__name__属性,主模块其值为__main__,导入模块其值为模块名     1.创建时间, ...

随机推荐

  1. java高并发系列 - 第31天:获取线程执行结果,这6种方法你都知道?

    这是java高并发系列第31篇. 环境:jdk1.8. java高并发系列已经学了不少东西了,本篇文章,我们用前面学的知识来实现一个需求: 在一个线程中需要获取其他线程的执行结果,能想到几种方式?各有 ...

  2. 【翻译】无需安装Python,就可以在.NET里调用Python库

    原文地址:https://henon.wordpress.com/2019/06/05/using-python-libraries-in-net-without-a-python-installat ...

  3. Unity/C#基础复习(5) 之 浅析观察者、中介者模式在游戏中的应用与delegate原理

    参考资料 [1] <Unity 3D脚本编程 使用C#语言开发跨平台游戏>陈嘉栋著 [2] @张子阳[C#中的委托和事件 - Part.1] http://www.tracefact.ne ...

  4. 从无到有构建vue实战项目(八)

    十六.vue-lazyload的使用 首先,我们需要下载vue-lazyload包: npm i vue-lazyload -S 下载好之后,我们将它引入到自己的项目: //main.js //引入图 ...

  5. Leetcode之广度优先搜索(BFS)专题-详解429. N叉树的层序遍历(N-ary Tree Level Order Traversal)

    Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tree Level Order Traversal) 给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右 ...

  6. C++ switch注意事项(陷阱)

    话不多说,直接上代码 int a; printf("请输入一个整数:"); scanf("%d", &a); switch (a) { : printf ...

  7. CodeForces - 1118 F2 Tree Cutting

    题目传送门 题解: 先注意到一定存在k种颜色,切成k个块, 然后要求每个块内的颜色都一样,所以可以发现同一种颜色一定在同一个块内,故任意2个相同颜色的最短路劲上的点的颜色都是该颜色. 我们可以先把任意 ...

  8. bzoj5072 小A的树 题解

    题意 给出一棵 n 个点的树,每个点有黑白两种颜色.q 次询问,每次 询问给出 x 和 y,问能否选出一个 x 个点的联通子图,使得其中 黑点数目为 y. 范围 n ≤ 5000,q ≤ 10^5 其 ...

  9. PHP-02.文件上传、php保存/转移上传的文件、常见的网络传输协议、请求报文及属性、响应报文及属性

    关系数组 array("key"=>"value",...) ; get没有数据大小的限制 post上传大小没有限制 不指定上传方式,默认是get 文件上 ...

  10. JS-特效 ~ 05. 缓动框架兼容封装/回掉函数/兼容透明度/层级、旋转轮播图、正则表达式、验证表单注册账号、

    缓动函数中opcity  写百分值的值 JS一般不用小数运算,会照成精度丢失 元素的默*认透明度是 层级一次性赋值,不缓动 利用for…in为同一个父元素的子元素绑定属性 缓动框架兼容封装/回掉函数/ ...