初识函数定义与调用
1 def mylen(s): 2 length = 0 3 for i in s: 4 length = length+1 5 print(length) 6 return length
总结一:
定义:def 关键词开头,空格之后接函数名称和圆括号(),圆括号()内's'为参数,最后还有一个":"。
def 是固定的,不能变,必须是连续的def三个字母,不能分开。。。它们要相亲相爱的在一起。
空格 为了将def关键字和函数名分开,必须空(四声),当然你可以空2格、3格或者你想空多少都行,但正常人还是空1格。
函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并能表达函数功能
括号:是必须加的,先别问为啥要有括号,总之加上括号就对了!
注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性。
调用:就是 函数名() 要记得加上括号,好么好么好么。
return关键字的作用
return 是一个关键字,在pycharm里,你会看到它变成蓝色了。你必须一字不差的把这个单词给背下来。
这个词翻译过来就是“返回”,所以我们管写在return后面的值叫“返回值”
要研究返回值,我们还要知道返回值有几种情况:分别是没有返回值、返回一个值、返回多个值
没有返回值
不写return的情况下,会默认返回一个None:我们写的第一个函数,就没有写return,这就是没有返回值的一种情况。
#函数定义 def mylen(): """计算s1的长度""" s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) #函数调用 str_len = mylen() #因为没有返回值,此时的str_len为None print('str_len : %s'%str_len)
只写return,后面不写其他内容,也会返回None,def定义函数中一旦遇到return,结束整个函数。
def ret_demo(): print(111) return print(222) ret = ret_demo() print(ret)
return None:和上面的两种情况一样,我们一般不这样写。
def ret_demo(): print(111) return None print(222) ret = ret_demo() print(ret)
返回一个值
刚刚我们已经写过一个返回一个值的情况,只需在return后面写上要返回的内容即可。
def mylen(): """计算s1的长度""" s1 = "hello world" length = 0 for i in s1: length = length+1 return length #函数调用 str_len = mylen() print('str_len : %s'%str_len)
注意:return和返回值之间要有空格,可以返回任意数据类型的值
返回多个值
可以返回任意多个、任意数据类型的值
def ret_demo1(): '''返回多个值''' return 1,2,3,4 def ret_demo2(): '''返回多个任意类型的值''' return 1,['a','b'],3,4 ret1 = ret_demo1() print(ret1) ret2 = ret_demo2() print(ret2)
返回的多个值会被组织成元组被返回,也可以用多个值来接收
def ret_demo2(): return 1,['a','b'],3,4 #返回多个值,用一个变量接收 ret2 = ret_demo2() print(ret2) #返回多个值,用多个变量接收 a,b,c,d = ret_demo2() print(a,b,c,d) #用多个值接收返回值:返回几个值,就用几个变量接收 a,b,c,d = ret_demo2() print(a,b,c,d)
#python中把用逗号分割的多个值就认为是一个元组。也适用于字符串、列表、字典、集合
函数的参数
我们告诉mylen函数要计算的字符串是谁,这个过程就叫做 传递参数,简称传参,我们调用函数时传递的这个“hello world”和定义函数时的s1就是参数。
实参与形参
参数还有分别:
我们调用函数时传递的这个“hello world”被称为实际参数,因为这个是实际的要交给函数的内容,简称实参。
定义函数时的s1,只是一个变量的名字,被称为形式参数,因为在定义函数的时候它只是一个形式,表示这里有一个参数,简称形参。
传递多个参数
参数可以传递多个,多个参数之间用逗号分割。
-------------------
函数进阶
- 命名空间和作用域
-
- 内置命名空间----python解释器
- 就是pyrhon解释器一启动就可以使用的名字存储在内置命名空间中
- 内置的名字在启动解释器的时候就被加载在内存里
- 全局命名空间----我们写的代码但不是函数中的代码
- 时在程序从上到下被执行的过程中依次添加进内存的
- 放置了我们设置的所有变量名和函数名
- 局部命名空间----函数
- 就是函数内部定义的名字
- 当调用函数时,才会产生这个命名空间,随着函数执行的结束,这个命名空间就又消失了
- 内置命名空间----python解释器
-
注:在局部,可以使用全局、内置命名空间中的名字
在全局,可以使用内置命名空间中的名字,但是不能使用局部命名空间中的名字
在内置,既不嫩局部也不能使用全局的
在正常情况下,直接使用内置的名字
当我们在全局定义了和内置名字空间中的名字时,会使用全局的名字
当全局没有的时候会找上一级内置去调,当全局有的时候就使用自己的
如果上一级也没有就再往上一级去调用,直到内置的名字空间都没有就报错
多个函数应该拥有多个独立的局部命名空间,
作用域
全局作用域 -- 作用在全局 -- 内置和全局名字空间中的名字都属于全局作用域 --globals
局部作用域 -- 作用在局部 -- 函数(局部名字空间中的名字属于局部作用域)--locals
对于不可变数据类型 在局部可以查看全局作用域中的变量
但是不能直接修改
如果想要修改,需要在程序一开始添加global声明
如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效
globals 永远打印全局的名字
locals 在局部就打印局部的,在全局的就使用全局的 根据所在位置输出