20200205
##函数
函数也是一个对象
对象是内存中专门用来存储数据的一块区域
函数可以用来保存一些可执行的代码,并且可以在需要的时候,对语句进行多次的调用
创建函数:
def 函数名([形参1,形参2,...]):
代码块
注意:函数名必须要符合标识符的规则(字母、数字、下划线,不能以数字开头)
函数中保存的代码不会立即执行,只有在调用代码的时候才会执行。
示例代码:
def fn()
print('hello')
print('我的第一个函数')
print(fn)
print(type(fn))
fn()
fn()
fn()
#fn是函数对象,fn()调用函数
#print是函数对象,print()调用函数
函数是实现某种功能,而非上述无用的功能。
代码:
def sum(num1,num2):
int sum
sum=num1+num2
print(sum)
sum()
##函数的参数
在定义函数时,可以在函数名后的()中定义数量不等的形参。多个形参之间使用,隔开
形参(形式参数):定义形参就相当于在函数内部声明了变量,但是没有赋值。
示例代码:
def sum(num1,num2):
num1=None
num2=None
实参(实际参数):如果函数定义时指定了形参,那么在函数调用时必须传递实参,实参会赋值给对应的形参,简单来说,几个形参就得传递几个实参。
##函数的传递方式
定义形参时,可以为形参指定默认值。如果用户传递了参数,默认值不生效;反之。
代码:
def fn(a,b,c=20):
print("a=",a)
print("b=",b)
print("c=",c)
fn(1,2,3)
fn(1,2)
实参的传递方式分为如下两类:
位置参数:对应位置的实参赋值给对应位置的形参
关键字参数:不按照形参定义的顺序去传递,而是直接根据参数名去传递参数。
位置参数和关键字参数可以混合使用,必须将位置参数写在前面。
##实参的类型
任何类型都可以作为实参。例如:字符串、数字、函数、boolean。
函数在调用时,解析器不会检查实参的类型。
示例代码:
def fn4(a):
#在函数中对形参进行重新赋值,不会影响其他变量
#a=20
#a是一个列表,尝试改变列表中的元素
#如果形参执行的是一个对象,当我们通过形参去修改对象时,会影响到所有只想该对象的变量
a[0]=30
print('a=',a,id(a))
c=[1,2,3]
fn4(c)
print("c=",c,id(c))
#,如果不想改变c的内容,可以使用c列表的副本:c.copy()或者c[:]
fn4(c[:])
##不定长的参数
定义一个函数,可以求任意数字的和。
上述问题,在定义函数时,可以在形参前边加上一个*,这样这个形参将会获取到所有的实参,
它将会将所有实参保存在一个元组中。
带*号的参数只能有一个,可以和其他参数配合使用
可变参数不是必须在最后一个,但是注意,带*的参数后的所有参数,必须使用关键字参数。
*号的参数只能接收位置参数
**号的参数可以接收关键字参数。它会将这些参数保存在字典中。key是参数的名字,字典value是参数的值。
**号的参数只能有一个,必须放置所有参数的最后。
示例代码:
def fn(*a):
print("a=",a,type(a))
fn(1,2,3,45,5)
#*a会接受所有的位置参数,并且会将这些实参统一保存到一个元组中(装包)
def sum(*nums):
result=0
for n in nums:
result+=n
print(result)
def fn(a,b,*c):
print("a=",a)
print("b=",b)
print("c=",c)
#c必须使用关键字参数
def fn(a,*b,c):
print("a=",a)
print("b=",b)
print("c=",c)
#b和c必须使用关键字参数
def fn(*a,b,c):
print("a=",a)
print("b=",b)
print("c=",c)
def fn(**a):
print("a=",a)
fn(a=1,b=2,c=3)
##参数的解包
使用*对元组解包,使用**对字典解包
示例代码:
def fn(a,b,c):
print("a=",a)
print("b=",b)
print("c=",c)
#创建元组
t=(10,20,30)
fn(t[0],t[1],t[2])
#传递实参时,也可以在序列类型的参数前添加星号,这样会自动将序列中的元素以此作为参数传递
#这里要求序列中元素的个数必须和形参的个数一致
fn(*t)
#创建字典
d={'a':12,'b':11,'c':9}
fn(**d)
##返回值
函数执行以后返回的结果
通过return来指定函数的返回值
可以直接使用函数的返回值,也可以通过一个变量来接受函数的返回值
return 后面可以跟任何的对象,也可以是函数
如果仅仅写一个return或者不写return,则相当于return None
函数中,return后的代码不会执行,return一旦执行函数自动结束。
break退出当前循环,continue跳过当此循环。
print(fn)
#fn是函数对象,打印fn实际是在打印函数对象
print(fn())
#fn()是在调用函数,打印fn()实际上实在打印fn()函数的返回值
##文档字符串
help()是python的内置函数,例如:help(print)
通过help()函数可以查询python中的函数的用法
语法:help(函数对象)
help(print)#获取print()函数的使用说明
文档字符串(doc str)
在定义函数时,可以在函数内部编写文档字符串,文档字符串就是函数的说明
当我们编写文档字符串时,就可以通过help()函数来查看函数的说明
文档字符串非常简单,其实直接在函数的第一行写一个字符串就是文档字符串
如果对外项目,建议使用英文。
示例代码:
def fn(a:int,b:bool,c:str='hello')->int:
'''
这是一个文档字符串的示例
函数的作用:....
函数的参数:
a,作用,类型,默认值
'''
return 10
help(fn)
##作用域(scope)
指的是变量生效的区域
示例代码:
b=20
def fn():
a=10#定义在函数内部,作用在函数内部,函数外部无法使用
print(a)
print(b)
fn()
print(a)
print(b)
python中一共有两种作用域:
全局作用域
全局作用域在程序执行时创建,在程序执行结束时销毁
所有函数以外的区域都是全局作用域
在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序的任意位置被访问
函数作用域
函数作用域在函数调用时创建,在调用结束时销毁
函数每调用一次就会产生一个新的函数作用域
在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
变量的查找
当我们使用变量时,会优先在当前作用域中寻找该变量,如果有则使用,如果没有则继续去上一级作用域中寻找,如果有则使用,如果依然没有继续去上一级作用域中寻找,以此类推,知道全局作用域,依然没有找到,则会抛出异常。
示例代码:
def fn3():
#a=10#函数中为变量赋值时,默认都是为局部变量赋值
#
global a
a=10
print("函数内部:",a=",a)
fn3()
print("函数外部部:",a=",a)