一、函数的定义与优势:

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。

Python提供了许多内建函数,比如print(),但也可以自己创建函数,这被叫做用户自定义函数。

二、函数的定义

1.函数代码块以def关键词开头,后接函数标识符名称和圆括号()。
2.任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
3.函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
4.函数内容以冒号起始,并且缩进。
5.Return[expression]结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

return 的作用 :返回结果,结束函数运行

代码如下:

def check_num():  #输入相应数字执行相应操作
    num = input('请输入你的选择:1,添加商品;2,查看商品;3,删除商品: ')
    if  num == '1':
        add_goods()   #调用函数
    elif  num == '2':
        check_goods()
    elif  num == '3':
        del_goods()
    else:
        print('输入错误,请重新输入。')
        return check_num() #递归调用

三、函数调用
定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。这个函数的基本结构完成以后,
你可以通过另一个函数调用执行,也可以直接从Python提示符执行。

四、函数的参数
形参:定义函数时传入的参数
实参:调用函数时传入的参数
必备参数:必备参数须以正确的顺序传入函数,调用时的数量必须和声明时的一样
命名参数:命名参数和函数调用关系紧密,调用方用参数的命名确定传入的参数值。你可以跳过不传的参数或者乱序传参,因为Python解释器能够用参数名匹配参数值
代码如下:
#!/usr/bin/python
#可写函数说明
def printinfo( name, age ):
   "打印任何传入的字符串"
   print "Name: ", name;
   print "Age ", age;
   return;

#调用printinfo函数
printinfo( age=50, name="miki" );
#以上实例输出结果:

#Name:  miki
#Age  50

缺省参数:调用函数时,缺省参数的值如果没有传入,则被认为是默认值
代码如下:
#!/usr/bin/python

#可写函数说明
def printinfo( name, age = 35 ):
   "打印任何传入的字符串"
   print "Name: ", name;
   print "Age ", age;
   return;

#调用printinfo函数
printinfo( age=50, name="miki" );
printinfo( name="miki" );
#以上实例输出结果:

#Name:  miki
#Age  50
#Name:  miki
#Age  35

五、变量作用域
全局变量与局部变量

局部变量:定义在函数内部的变量

全局变量:定义在函数外部的变量

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。

调用函数时,所有在函数内声明的变量名称都将被加入到作用域中

注:全局变量如果要在函数中修改的话,需要加global关键字声明(函数中),如果是list、字典和集合的话,则不需要加global关键字,直接就可以修改。

Head first Python 函数总结:
1,函数是命名的代码块
2,def关键字用来命名函数,函数代码的def关键字下(相对def关键字)缩进
3,Python的三重引号字符串可以用例为函数增加多行注释。如果采用这种方式,它们称为docstring
4,函数可以接收任意多个命名参数,也可以没有参数
5,return语句允许函数返回任意多个值(也可以不返回任何值)
6,函数注解可以用例描述函数参数的类型以及函数的返回类型
7,任何函数参数都可以在函数的def行赋一个默认值。如果为一个参数设置了默认值,调用函数时,为这个参数指定值就是可选的
def search4letters(phrase:str,letters=:str='aeiou'):
    #为letter 参数赋了一个默认值,如果调用代码没有提供替代值,就会使用这个默认值
8,除了按位置赋参数,还可以使用关键字。使用关键字,任何顺序都是可以的(因为使用关键字可以去除任何二义性,位置不再重要)
search4letters('galaxy','xyz') #位置赋值,第一个字符串赋值给phrase,第二个字符串赋值给letters
search4letters(letters='xyz',phrase='galaxy')# 关键字赋值,按参数名来引用参数