lecture 1复习
函数
1 为什么要用函数
- 易于阅读,维护
如果程序的功能比较多,规模比较大,把所有代码都写在main函数中,就会使主函数变得庞杂、 头绪不清,阅读和维护变得困难 - 模块化,可重复利用
有时程序中要多次实现某一功能,就需要多次重复编写实现此功能的程序代码,这使程序冗长,不精炼
模块化程序设计:函数
- 函数就是功能
- 每一个函数用来实现一个特定的功能
- 函数的名字应反映其代表的功能
函数: 库函数,自定义函数,外部模块的函数
实例:
@@@
how do you do!
@@@
I'm good
@@@
思路:两个文字输出函数+一个符号输出函数
def print_at():
print("@@@")
def print_greeting1():
print("how do you do!")
def print_greeting2():
print("I am good")
print_at()
print_greeting1()
print_at()
print_greeting2()
print_at()
2 main函数的问题
和C语言不同,python无需“入口” ,程序从前往后编译 不写main()也没有问题
当然,如果对封装有要求或者需要进行模块测试,还是要写的:
一般写法:
if name == "main":
main()
- 如果模块被导入,name值为模块名
- 如果模块被执行,name值为main
见m1,m2
3 函数定义
先定义,后使用
- 指定函数的名字,以便以后按名调用
- 指定函数类型,即函数返回值的类型
- 指定函数参数的个数和类型,以便在调用函数时向它们传递数据
- 指定函数的功能。这是最重要的,这是在函数体中解决的
例子:无参函数定义
def my_function():
print("Hello from a function")
有参函数定义:
def my_function(fname):
print(fname + " Gates")
3.1 参数定义(形参)
发送到函数的参数可以是任何数据类型(字符串、数字、列表、字典等),并且在函数内其将被视为相同数据类型。
例如,如果将 List 作为参数发送,它到达函数时仍将是 List(列表)
- 必选参数:调用函数时候必须赋值的参数,顺序必须和声明时一致
- 默认参数:初始已经有值,在调用时未更改使用默认值
def my_function(country = "China"):
print("I am from " + country)
- 可变参数: 不确定参数个数,会分配给带“”参数 常使用args
def my_function(*kids):
print("The youngest child is " + kids[2])
- 关键字参数:使用关键字参数允许函数调用时参数的顺序与声明时不一致
def my_function(child3, child2, child1):
print("The youngest child is " + child3)
my_function(child1 = "Phoebe", child2 = "Jennifer", child3 = "Rory")
3.2 返回值
return 语句
3.3 嵌套定义
和C C#等不同,可以嵌套定义,内层函数可以访问外层函数中定义的变量,但不能重新赋值,内层函数的local namespace不包含外层函数定义的变量。外部无法访问内部函数。例子:run.py
def foo(): #定义函数foo(),
m=3 #定义变量m=3;
def bar(): #在foo内定义函数bar()
n=4 #定义局部变量n=4
print m+n #m相当于函数bar()的全局变量
bar() #foo()函数内调用函数bar()
4 函数调用
4.1 调用形式
- 函数调用的一般形式为: 函数名(实参表列)
- 如果是调用无参函数,则“实参表列” 可以没有,但括号不能省略
- 如果实参表列包含多个实参,则各参数间用逗号隔开
按函数调用在程序中出现的形式和位置 来分,有3种调用方式:
1.单独一个语句
print_greeting()
2.函数表达式
c=sum(a,b)
3.函数参数
c=sum(a,sum(b,c))
此时sum(b,c)为sum另一次调用的实参
4.2 顺序问题
先定义
后调用
例子,函数之间互相调用
def a():
b()
def b():
print("hello!")
print("hey")
a()
程序执行的时候,读取到函数的定义的时候,这是记录下函数的名单,知道有这么些函数,但是不看函数里面的内容,当需要执行函数的时候才去读取这个函数里面的内容。
上面的代码在执行的时候,程序先见了a()的定义,又见了b()的定义,再执行a()的时候,直接去找程序见过的函数了。如果调用函数的时候程序还没见过这个函数,是不能成功运行的。
4.3 数据传递
形式参数
定义函数时函数名后面的变量名称为“形式参数”
实际参数
调用一个函数时,函数名后面 参数称为“实际参数” , 实参可以是常量,变量,表达式
实参和形参间的数据传递
在调用函数过程中,系统会把实参的值传递给被调用函数的形参 。或者说,形参从实参得到一个值 。该值在函数调用期间有效,可以参加被调函数中的运算。在未出现函数调用时,形参并不占内存中的存储单元。 在发生函数调用时,函数的形参被临时分配内存单元。

练习 写一个max函数
5 嵌套调用
既可以嵌套定义,也可以嵌套调用。即调用一个函数的过程中,又可以调用另 一个函数。

练习 找出4个数中的最大数
6 递归调用
见pdf
7 作用域和生存期
全局变量 局部变量
练习
- 指数函数
- 阶乘函数(递归)
网友评论