python基础--函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python基础--函数相关的知识,希望对你有一定的参考价值。
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
特性:
1. 减少重复代码
2. 使程序变的可扩展
3. 使程序变得易维护
在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
函数分类
内置函数
自定义函数
python解释器已经为我们定义好了的函数即内置函数。
可以直接使用的函数,如len(),sum(),max()
自定义函数规则:
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
#语法
def 函数名(参数1,参数2,参数3,...):
‘‘‘注释‘‘‘
函数体
return 返回的值
def hello():
print("hello word")
hello()
在python中函数要先定义后才能调用
def hello():
print("hello")
word()
hello()
def hello():
print("hello")
word()
hello()
def word():
print("word")
报错word未定义
def hello():
print("hello")
word()
def word():
print("word")
hello()
正常运行
可以把函数的运行分成两部
函数的定义
函数的调用
定义时对函数进行语法分析,不执行函数
调用时检测逻辑是否正确返回结果
上面是不带参数的函数
还有带参数的函数
def mysum(a,b):
res = a + b
print(res)
mysum(1,2)
a,b叫形参(函数定义时的参数)
1,2叫实参(函数调用时传递的参数)
形式参数(变量)只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
实参可以是常量、变量、表达式、函数等,无论实参是何种类型,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定的值
默认参数
如果在传参数时有一个参数是相同的或者很少变可以写成默认参数
例如:
def register(name,age,country="CN"):
print(name)
print(age)
print(name)
print(country)
register("Jack",16)
register("Mike",18,"USA")
运行结果如下
关键字参数(键-值对参数)
正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,关键字参数必须放在位置参数之后。
结果
总结:
一、位置参数
调用函数时根据函数定义的参数位置来传递参数
二、关键字参数
用于函数调用,通过“键-值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。
三、默认参数
用于定义函数,为参数提供默认值,调用函数时可传可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)
默认参数的使用:就是某一个参数只有在少数情况下需要修改!
默认参数跟位置参数同时存在的话,要把默认参数放在后边啊,放在前边的话,如果只传一个参数进去,编译器也不知道你是谁。
默认参数不可以是可变对象。因为可变对象有可能在函数中值发生改变,也就不是默认值了。
非固定参数(可变参数)
如果函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数
结果
如果可变参数不传参数则为空元组
def register(name,age,args): # args 会把多传入的参数变成一个元组形式
print(name,age,args)
register(‘Jack‘,20,"python","php","java")
register(‘Mike‘,18)
还可以有一个*kwargs
kwargs 会把多传入的参数变成一个dict形式
#如果为空则返回空元组 空字典
kwargs 会把多传入的参数变成一个dict形式
def register(name,age,args,**kwargs):
print(name,age,args,kwargs)
register("Jack",20,"CN","Python",sex="Male",province="jiangsu")
#如果为空则返回空元组 空字典
register("Mike",16)
参数组合
具体的使用中,经常会不止使用到一种参数。这些参数是有顺序的:
位置参数,默认参数,可变参数,键值对参数(关键字参数)
局部变量
函数内部可以使用全局变量
如果在函数内部进行赋值改变则只在函数内部起作用
结果如下:
name = "我是全局变量"
def change_name(name):
print("使用传递的全局变量:",name)
name = "我是函数的局部变量"
print("使用函数内部的变量", name)
change_name(name)
print("外部打印:",name)
全局与局部变量
在函数中定义的变量称为局部变量(作用于本函数),在函数外部定义的变量称为全局变量(作用于整个程序)。
全局变量作用域是整个程序,局部变量作用域是定义该变量的函数。
当全局变量与局部变量同名时:
在定义局部变量的函数内,局部变量起作用;在其它地方全局变量起作用。
作用域
在 Python 函数中会创建一个新的作用域,只在函数体内起作用
当在函数体中遇到变量时,Python 会首先在该函数的命名空间中寻找变量名,如果找不到就找全局变量
strs = "teststring"
print(id(strs))
def foo():
print(strs)
print(id(strs))
foo()
print(id(strs))
可以看出地址不改变
如果在函数内重新赋值会是什么情况那?
strs = ‘abc‘
print(id(strs))#abc的地址
def foo():
strs = ‘cde‘
print(id(strs))#输出新创建的地址
print(strs)#新创建的地址的内容即cde
foo()
print(id(strs))#全局变量abc的地址
print(strs)#全局变量不会改变
输出结果
全部变量可以被访问(如果是可变类型,甚至可以被修改)。foo(),实际上是在栈中创建了一个和全局变量相同名字的局部变量,通过在函数 foo 中打印局部命名空间可以印证这一点。在函数执行完后执行完后输出全局变量可以看到,全局命名空间里变量 strs 的值并没有改变地址也不会变。
以上是关于python基础--函数的主要内容,如果未能解决你的问题,请参考以下文章
[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础