Lecture 2

作者: shyanneshan | 来源:发表于2020-08-28 09:28 被阅读0次

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()

  1. 如果模块被导入,name值为模块名
  2. 如果模块被执行,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 作用域和生存期

全局变量 局部变量

练习

  1. 指数函数
  2. 阶乘函数(递归)

相关文章

网友评论

      本文标题:Lecture 2

      本文链接:https://www.haomeiwen.com/subject/rvhksktx.html