1.函数
为了定义python函数,可以依次输入def,函数名,带有函数参数的圆括号,最后紧跟一个冒号,函数命名规范和变量名一样,(必须使用字母或者下划线开头,仅能含有字母,数字,下划线)
首先,定义和调用一个没有参数的函数:
def do_nothing():
输出:
pass #函数中的pass表明函数没有做任何事情
通过输入函数和参数调用此函数
print(do_nothing())
同样是没有做任何事情
现在,定义一个无参数,但打印出一个单词的函数:
def make_a_sound():
print('quack')
print(make_a_sound()) #在调用make_a_sound()函数时,python会执行函数内部的代码,在该列子中,函数打印吃单个单词,并返回主程序
输出:
quack
def agree():
return True
输出:
None
调用该函数,使用if语句检查它的返回值
def agree():
print("splendid")
else:
print("that was unexpected")
输出:
splendid
定义带有一个anything参数的函数echo(),它使用return语句将anything返回它的调用者两次,并在两次中间插入一个空格,
传入到函数的值称为参数,当调用含参数的函数时,这些参数的值会被复制给函数中的对应参数,在下面的列子中,被调用的函数
echo()的传入参数字符串是‘rumplestiltskin’,这个值被复制给参数anything,然后返回到调用方(在这个列子中,输出两次字符串,
中间有一个空格)
def echo(anything): #带有参数的函数
return anything + '' + anything
print(echo('rumplestiltskin')) #调用参数
输出:
rumplestiltskinrumplestiltskin
该函数做了以下事情:
.把‘blue’赋值给函数的内部参数color
.运行if-elif-else的逻辑链
.返回一个字符串
.将该字符串赋值给变量comment
.打印出comment
def commentary(color):
if color == 'red':
return 'it\'s a tomoto' #用\‘和\"来表示单双引号,由其当该字符串由相同类型的引号包裹时
elif color == 'green':
return 'it\'s a green pepper'
elif color == 'bee purple':
return 'I don\'t kown what it is,but only bees can see it'
else:
return "I've never heard of the color " + color + "."
comment = commentary('blue')
print(comment)
输出:
I've never heard of the color blue.
一个函数可以接受任何数量(包括0)的融合类型的值作为输入变量,并且返回任何数量(包括0)的任何类型的结果,
如果函数不显示调用return函数,那么会默认返回None
print(do_nothing)
2.有用的None
None是Python中特殊的值,区别None和False的差别:
thing = None
if thing:
print("it's some thing")
else:
print("it's no thing")
输出:
it's no thing
#为了区分None和布尔值False
if thing is None:
print("it's nothing")
else:
print("it's something")
输出:
it's nothing
#写一个函数,输出它的参数是否是None
def is_none(thing):
if thing is None:
print("it's None")
elif thing:
print("it's True")
else:
print("it's false")
is_none(None)
输出:
it's None
is_none(True)
输出:
it's True
is_none(False)
输出:
it's false
is_none(0)
输出:it's false
is_none(0.0)
输出:
it's false
is_none(())
输出:
it's false
is_none([])
输出:
it's false
is_none({})
输出:
it's false
is_none(set())
输出:
it's false
3.位置参数
下面创建一个带有位置参数的函数,并且返回一个字典:
def menu(wine,entree,dessert):
return {'wine':wine,'entree':entree,'dessert':dessert}
menu('chardonnary','chicken','cake')
输出:
{'wine': 'chardonnary', 'dessert': 'cake', 'entree': 'chicken'}
尽管这种方法很常见,但是位置参数的一个弊端就是必须熟记每个位置参数的含义,,在调用函数menu()时,误把最后一个参数
当成第一个参数,会得到完全不同的结果
menu('beef','bagel','bordeaux')
输出:
{'wine': 'beef', 'dessert': 'bordeaux', 'entree': 'bagel'} (错误的)
4.关键字参数
为了避免参数带来的混乱,调用函数时可以指定对应的参数的名字,甚至可以采用与函数定义不同的顺序调用:
menu(entree='beef',dessert='bagel',wine='bordeaux')
输出:
{'wine': 'bordeaux', 'dessert': 'bagel', 'entree': 'beef'}
也可以把位置参数和关键字参数混合起来,首先实例化参数wine,然后对参数entree和dessert使用关键字参数
menu('frontenac',dessert='flan',entree='fish')
输出:
'wine': 'frontenac', 'dessert': 'flan', 'entree': 'fish'}
* 如果同时使用位置参数和关键字参数,位置参数必须放在关键字参数前面
5.指定默认参数值
当调用方没有提供对应的参数值时,可以指定默认的参数值
def menu(wine,entree,dessert = 'pudding'):
return {'wine':wine,'entree':entree,'dessert':dessert}
print('chardonnay','chicken')
输出:
{'entree': 'chicken', 'dessert': 'pudding', 'wine': 'chardonnay'}
如果提供参数值,在调用时会替代默认值
menu('dunkefelder','duck','doughnut')
输出:
{'entree': 'duck', 'dessert': 'doughnut', 'wine': 'dunkefelder'}
在下面的列子中,函数bugg()在每次调用时,添加参数arg到一个空的列表result,然后打印出一个单值列表,但是存在一个问题:只有
在第一次调用时列表是空的,第二次调用就会存在之前调用的返回值
def buggy(arg,result = []):
result.append(arg)
print(result)
buggy('a')
输出:['a']
buggy('b')
输出:
['a', 'b']
如果写成下面这种形式就能解决上面的问题
def works(arg):
result=[]
result.append(arg)
return result
works('a')
输出:
['a']
works('b')
输出:
['b']
下面这种方式也能实现;
def nonbuggy(arg,result = None):
if result is None:
result = []
result.append(arg)
print(result)
nonbuggy('a')
输出:
['a']
nonbuggy('b')
输出:
['b']