函数的分类
- 函数分为两种类型: 一种设计成返回值,一种仅执行代码而不返回
- 函数用来将复杂的问题分解为更小的问题,进而消除重复性代码,通过分解为不同的逻辑单元使其更容易阅读
内建函数
python中自带的函数,返回值由python规定
用户自定义函数
自定义返回值的函数
def 函数名(参数1,参数2,...):
语句块
return 返回值
注:一旦return语句得到执行,函数立即终止。return语句可以出现在函数体中的任何位置。
python有一个称为None的对象用来表示空值,此对象没有任何方法。
传递参数的形式
按照位置传递参数:调用语句中的实际参数与函数头中的形式参数一一对应,实参的数目必须与形参相同,实参的数据类型必须与形参相同
按照默认值传递参数
一个函数的某些(或者全部)参数可以有默认值——当没有值传递给它们时而赋给的值。
def total(w,x,y=10,z=20):
return((w**x)+y+z)
total(2,3) //2^3+10+20 38
total(2,3,4) //2^3+4+20 32
total(2,3,4,5) //2^3+4+5 //17
注:在函数定义中,没有默认值的参数必须放在有默认值的参数前面,如def func(x,y=2,z)
是不合法的
按照关键字传递参数
实际参数可以通过使用相应形式参数的名字传递给函数,而不是根据位置
def total(w,x,y=10,z=20):
return((w**x)+y+z)
total(y=4,x=3,w=2) //2^3+4+20 32
total(2,y=4,x=3) //2^3+4+20 32
total(2,3,y=4) //2^3+4+20 32
total(w=2,3,y=4) //error ,不合法,按位置传递的实参必须要放在按关键字传递的实参前(形参类似)
注:当实际参数是一个表达式时,先要计算表达式,然后将它的值传给形式参数
向函数传值
如果函数调用的实际参数是一个变量,那么由实际参数变量指向的对象(而不是实际参数变量本身)传递给了形式参数变量。因此,如果对象是不可变的且函数改变了形式参数变量的值,实际参数所指向的对象不会发生任何改变,当实际参数变量指向数值、字符串或元组对象时,不管怎样通过函数调用改变实际参数的值,都是不可能的。
main()函数
主函数(main函数)既没有参数,也没有返回值,是程序的入口函数
def main():
函数体
main()
注:python中需要调用主函数,之后初始化要执行的任务(一般将第一个函数命名为main,它的前面有import语句和全局变量,所有的程序将以main()语句结尾,从而调用main()函数)
变量作用域
- 在函数内部创建的变量只能被同一函数内部的语句访问,并且当函数退出后变量就不存在了。(每次函数被调用时变量再重新创建),这样的变量对于函数来说是局部的,有局部作用域。对于函数的参数同样成立。
- 如果在两个不同的函数创建了同样名称的变量,那么它们之间没有任何关系,可以当作完全不同的变量,对于函数的参数同样成立。
def main(): x=2 print(str(x)+": function main") trivial() print(str(x)+": function main") def trivial(): x=3 print(str(x)+": function trivial") main() #输出结果 2 : function main 3 : function trivial 2 : function main
局部变量
def main():
x=5
trivial()
def trivial():
print(x)
main()
# 结果会产生一个NameError的回溯错误,因为主函数创建的x无法被trivial()识别
全局变量
- 定义:一个变量可以被程序中任何部分识别,这样的变量叫做全局变量
- 创建方式:将创建它的赋值语句放在程序顶部
- 任何函数都能读取全局变量的值,然而它的值不能在函数内部进行修改,除非修改语句之前有以下的语句形式
global 全局变量名
注:global仅影响所在函数体内其后的语句,它不允许在其他函数内部修改全局变量的值。
x=0 #定义一个全局变量
def main():
print(str(x))
trivial()
print(str(x))
def trivial():
global x
x += 7
print(str(x))
#输出结果
0
7
7
命名常量
命名常量的名字使用大写字母的单词,并且单词间使用下划线分隔,并赋给一个常量。
INTEREST_TATE = 0.04
BOOK_TITLE = "python"
注:python中允许给任何变量重新赋值,程序员要负责地不改变这个变量的值
库模块
- python通过称为库模块的文件支持函数的重用
- 库模块是一个扩展名为.py的文件,包含了可以被其他任何程序使用(我们可以称为imported)的函数和变量
- 库模块可以使用IDLE和任何文本编辑器进行创建
#不使用库模块 def add(x,y): flag = x+y return flag amount = add(7,8) print(str(amount))
#使用库模块 #方式一 import sum #sum.py文件为add函数的声明与定义 amount = sum.add(7,8) #使用sum.add()代替上述add() print(str(amount))
#使用库模块 #方法二 from sum import * //表示调用sum.py文件的所有函数 amount = add(7,8) print(str(amount))
python标准库模块
- os 删除和重命名文件
- os.path 确定指定的文件是否存在,是os的子模块
- pickle 在文件中存储对象(如字典、列表和集合),并能从文件中取回对象
- random 随机选择数字和子集
- tkinter 支持程序拥有一个图形用户界面
- turtle 支持图形化turtle
- math 包含了三角函数、指数函数和对数函数
函数
调用其他函数的函数
一个函数可以调用另一个函数,当被调用的函数结束时(return语句之后或被调用函数的最后一个语句执行完毕之后),控制流程返回到调用函数中调用发生之后的位置
def main():
firstPart()
print(str(4)+": from function main")
def firstPart():
print(str(1)+": from function firstPart")
secondPart()
print(str(3)+": from function firstPart")
def secondPart():
print(str(2)+": from function secondPart")
#输出结果
1: from function firstPart
2: from function secondPart
3: from function firstPart
4: from function main
列表解析
当我们想要对列表中的每个元素执行一个特定函数时,一个for循环可以完成。但是,更加简单的方法是使用列表解析。
list2 = [f(x) for x in list1] #将list1的每个元素的f(item)放入列表list2中,f不是一个内建函数就是用户自定义函数
def g(x):
return (int(x)**2)
list1 = ['2','5','6','7']
list2 = [g(x) for x in list1] #list2=[4,25,36,49]
过滤列表
在列表解析时加入if语句对列表进行筛选
list2 = [g(x) for x in list1 if int(x)%2==1] #list2=[25,49],只有奇数的平方才会出现在列表里
注:列表解析可以用在字符串、元组和range函数产生的算术表达式