函数就是可以在程序中重复使用的程序段,对这些程序段进行命名以后,可以进行重复调用。用关键词‘def’来定义。
函数的定义方法
例如:
-
无参数的函数
def say_hi():---------------定义名为say_hi的函数,记住,def后要加空格并以冒号结尾。
print(“hi!")----------------函数say_hi的本体内容即打印hi。 注意使用tab键进行缩进。
上述两行代码可视为一个单元,下一行代码开始丁哥写,因为python完全靠缩进来控制。
say_hi()--------------------------调用函数say_hi 注意,调用时不要忘记后面的括号,且调用几次函数,则有几个输出。如果调用三次say_hi,则输出两行hi。 -
含有参数的函数
def print_sum|_two(a,b):-----------定义函数print_sum_two(a,b)
c=a+b---------------------------函数的本体 注意使用TAB键
print( c ) -----------------------函数的本体
print_sum_two(3,6)------------------调用函数对3和6进行操作
def hello_some(str):
print(“hello “+str+”!”)---------------一定要记得使用TAB键
hello_some(“python”)
输出:hello python!
def repeat_str(str,times):
repeated_strs=str*4
return repeated_strs----------------此处是一个返回型的函数,即函数结果是为了在系统里产生一个值,而不 是在输出打印出这个值,
output=repeat_str(“have fun”,4)-------------要输出这个值,必须再定义一个变量,并打印
print(“output:”,output)
输出:output: have funhave funhave funhave fun
全局变量和局部变量
定义在函数本体外的变量在整个程序中都是确定的,成为全局变量。而定义位置在函数本体内的只在函数中有效,在函数外就是未定义的变量了。
例如:
x=60-------------------此处的x即为全局变量
def foo(x):
print("x is ",x)------------------------------------因为函数内还没定义x,故此处的变量为上述x=60
x=3 -----------------------------------此处的x是局本变量,出了函数范围x的值还是60
print("change x to "+str(x))-------------------------使用的是局部变量x=3
foo(x)
print("x is still "+str(x))
输出:
x is 60
change x to 3
x is still 60
我们也可以在函数中定义全局变量,只需要在变量前面添加global+空格
例如:
x=60
def foo():------------此处不能写为foo(x),不然会报错
global x--------------规定函数之后定义的x是全局变量
print("x is ",x)----------还未定义x,所以x还是为之前的60
x=3--------------------------------定义x=3,并且是全局变量,从此之后的x都是3
print("change x to "+str(x))------------
foo()
print("x is still "+str(x))
输出:x is 60
change x to 3
x is still 3
默认参数 (default parameter)
关键字参数(keyword parameter)
VarArgs参数(不用指明参数的个数有多少,灵活地来定义)
在例子中:
def repeat_str(s,times=1):----------------------------在定义函数的时候就规定了默认的times为1
repeated_strs=s*times
return repeated_strs
repeated_strings=repeat_str(“happy”)--------------在调用函数的时候没有指明times的值,就是用默认的times参数,并且python会把指明的内容与定义函数时的参数进行对比来确定输入的是哪个参数。
print( repeated_strings)
repeated_strings2=repeat_str(“happy”,4)-------------在调用函数的时候有指明times的值,就是用指定的times参数
print(repeated_strings2)
输出:
happy
happyhappyhappyhappy
再例如:
**def func(a,b=4,c=8):--------定义了a,b,c的默认参数
print("a is ",a,"b is ",b,"c is ",c)
func(13,17)---------------没有指明参数的从属,python会自动从左往右进行配对,即a=13,b=17,c=8
func(125,c=24)----------125没有指定从属,即视为a,a=125,b=4,c=24
func(c=40,a=80)---------都指定了从属,a=80,b=4,c=40**
上述即为关键字参数的使用
VarArgs参数
例子:
*def print_paras(fpara,numbs,word):
print(“fpara:”,str(fpara))
print(“numbs:”,str(numbs))
print(“word:”,str(word))
print_paras(“hello”,1,2,3,4,word=“python”,another_word=“java”)
输出:
fpara: hello
numbs: (1, 2, 3, 4)-----------------当作了一个元组对待
word: {‘word’: ‘python’, ‘another_word’: ‘java’}-----------当作一个词典对待(因为也是关键字对应的方式)
**注意:前面没有加星号的变量,是正常的定义变量,前面有一个星号的的变量属于不确定输入个数的变量,前面带有两个星号的变量则是指带有关键字参数的变量,比如上述例子的word即为关键字。python自动从左往右一词去定义配对。
改动一下例子:
**1. def print_paras(fpara,*numbs,word):
print(“fpara:”,str(fpara))
print(“numbs:”,str(numbs))
print(“word:”,str(word))
print_paras(1,2,3,4,“hello”,word=“python”,another_word=“java”)
输出则变为了:
fpara: 1
numbs: (2, 3, 4, ‘hello’)
word: {‘word’: ‘python’, ‘another_word’: ‘java’}
**2. def print_paras(*numbs,fpara,word):
print(“fpara:”,str(fpara))
print(“numbs:”,str(numbs))
print(“word:”,str(word))
print_paras(“hello”,1,2,3,4,word=“python”,another_word=“java”)
输出:TypeError: print_paras() missing 1 required keyword-only argument: 'fpara’
由改例1可知,没有加星号的变量只能对应一个值,由2知道且只能是第一个,若把带星号的变量放在前面,系统就会不知道那个值分配给无星号的变量。