“Python基础开发”课程_课堂笔记(HTML版_010)
Class notes of "Python basic development",this webPage is tenth page.
本页面没有“代码demo索引”。
3.2 Python变量范围
3.2.1 教学目标
在程序我们看到主程序中包含了函数,在函数内部有自己的变量,在主程序也有自己的变量,那么这些变量是什么关系,怎么样在函数内部使用主程序的变量。
我们(在这小节)的任务就是要分清这些变量的性质,掌握局部变量与全局变量的使用
3.2.2 局部变量
局部变量也称为内部变量,局部变量是在函数内作定义说明的,其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。
以下是本知识点的示例代码:
def sum(m) :
s=0
for p in range(m+1):
s=s+p#计算(1+2+...+m)的和
return s
#上面是函数体,下面是主程序
m= 10
s= sum (m)
print(s)p
上面这个例子中的p就是“局部变量”,只能够在定义它的函数中使用,而不能够在其它函数中使用,同时,一个函数中,也不能使用其它函数中定义的变量。
各个函数是相对独立的(平行关系)每个函数都分配在自己的区域,(局部变量)互不相干。
函数之间,可以互相调用(在一个函数中调用另一个函数整体)
——“形式参数”是“被调函数”的局部变量;
——“实际参数”是“主调函数”的局部变量;
——允许在不同的函数中使用同名变量(好吧,其实是因为互不相干,没什么好滑稽的)
示例代码:
def fun(x,y):
print("In fun:")
x = 1
y = 2#这两行赋值代码是无效的
x = 1048576#1024的平方
y = 1073741824#1024的立方
fun(x,y)
print(x,y) #主程序中的局部变量
3.2.3 全局变量
全局变量的作用域是整个程序。
如果一个函数内部要用到主程序的变量,那么可以在这个函数内部声明这个变量为global变量,这样函数内部用的就是主程序的变量了。当在函数中改变了全局变量的值时,会直接影响到主程序这个变量的值。
下面这个例子,仅用于解说“全局变量的作用域”,离开了教程,没有实际用途,因此不加入索引列表。
def fun(x) :
global y#声明这是一个全局变量(fun中的变量y不是fun本地的局部变量,而是主程序的全局变量)
y=0
x=0
x=1
y=2
fun(x)
print(x, y)
执行该程序结果为:
1 0
然后,可以多做几个关于全局变量的实例,同样,不加入索引列表。
def A(x) :
global y#声明这是一个全局变量
y = 0
x = 0
#这两个函数,是平行关系
def B(x):
global y
y = 10
x = 0
x = 1
y = 2
A(x)
B(y)
print(x, y)#1,10
因为在A、B两个函数中,都使用了全局变量关键字“global”定义了全局变量y,声明了变量y不是本地的(局部)变量,而是主程序中的(全局)变量。
3.2.4 两种变量
- 第一,全局变量的作用域,是整个程序,在程序开始的时候就存在,任何函数都可以访问(全局变量),而且全部函数访问的同名称全局变量,都是同一个变量,它只在程序结束时,才销毁。
- 第二,局部变量是只在函数内部使用的变量,当执行此函数时,才有效,退出函数后,局部变量就会被销毁。不同函数之间的局部变量是不同的,同名变量无关。
- 第三,局部变量有局部性,这使得函数有对立性,函数与外界的接口只有函数参数与它的返回值,使程序的模块化更突出,这样有利于开发大型的程序。 全局变量具有全局性,是实现函数之间数据交换的公共途径,但大量地使用全局变量会破坏函数的独立性,导致程序的模块化程度下降,因此要尽量减少使用全局变量,多使用局部变量,函数之间应尽量保持其独立性,函数之间最好只通过接口参数来传递数据。
3.3 函数调用
在Python语言中,所有的函数定义,包括主函数主程序在内都是平行的。
函数之间允许相互调用,也允许嵌套调用,习惯上把调用者称为主调函数。
我们(在这小节)的任务就是来掌握函数的调用关系,掌握参数传递的规则。
程序的执行总是从主程序函数开始,完成对其它函数的调用后再返回到主程序函数,最后由主程序函数结束整个程序。
嵌套调用就是一个函数调用另外一个函数,被调用的函数又进一步调用另外一个函数,形成一层层的嵌套关系,一个复杂的程序存在多层的函数调用。
main
#不知道是由于什么原因,我个人写网页和Word文档,很不喜欢插入图片(感觉就是那种能不插入图片,就尽量用文字描述图片内容)
link start!
function A#主程序函数首先调用A函数,在A函数中调用了B函数,在B函数中调用了C函数;
function B# C函数执行结束后,返回B函数的调用处,程序继续执行B函数;
function C# B函数执行结束后,返回A函数的调用处,程序继续执行A函数;
function D# A函数又调用了函数D,D函数执行结束后,返回A函数的调用处,程序继续执行A函数;
mission passed# A函数执行结束后,返回主程序函数的调用处,主程序继续执行,直到结束。
end of run
综上所述,程序结构如下:
def D():
return 1
def C():
return 2
def B():
print("Program running,function B")
C()#在B函数中调用了C函数
return 3
def A():
print("Program running,function A")
B()#A函数先调用了B函数
print("Program running,function D")
D()#A函数后才调用D函数
#Python的习惯是,在自定义函数写完之后,再来写主程序
...
A()#在主程序中只调用了A函数
函数调用可以这样一层层嵌套下去,但是禁止出现“死循环”!(两个函数反复调用,永不退出)
【例题】计算1+(1+2)+(1+2+3)+...+(1+2+3+…+n)的结果
def sum(m):
s = 0
for n in range(1,m+1):
s = s+n#累加
return s
def sumAll(n):
s = 0
for m in range(1,n+1):
s = s+sum(m)#调用上一个自定义函数
return s
#下面开始写主程序
n = int(input("n="))
print("1+(1+2)+(1+2+3)+...+(1+2+3+…+"+str(n)+")="+str(sumAll(n)))
运行程序,拿5举例子:
>>>
====================== RESTART: D:\code\Python2020_demo.py =====================
n=5
1+(1+2)+(1+2+3)+...+(1+2+3+…+5)=35
>>>
运行程序,拿10举例子:
>>>
====================== RESTART: D:\code\Python2020_demo.py =====================
n=10
1+(1+2)+(1+2+3)+...+(1+2+3+…+10)=220
>>>
【例题】分解质因数(老师当时没有运行,我的运行结果显示,需要跳过1,算是不完美,因此不加入索引)
def prime(m):
for n in range(2,m):
if m%n ==0:
return
return 1
n = int(input("正整数:"))
for p in range(1,n+1):
if n%p == 0 and prime(p) == 1:
print(p)
3.4 函数默认参数
3.4.1教学目标
在Python语言中定义函数时可以预先为部分参数设置默认值,这样的好处是实际调用时可以不提供该参数的实际值,该参数使用默认值,我们(在这小节)的任务就是来掌握函数参数默认值的规则。
3.4.2 默认参数的使用
函数默认参数就是在函数定义时为一些参数预先设定一个值, 在调用时如果不提供这个参数的实际值就使用默认的参数值。(示例略,离开教程后,无实际用途)
3.4.2 默认参数的位置
“位置参数”是函数在定义时,写在小括号里面的空白变量,要写在靠前的位置;
“键值参数”是函数在定义时,已经在小括号内赋予初值的变量,要写在靠后的位置。
Python规定,有默认值的键值参数,必须出现在,没有默认值的位置参数,后面。
例如下面函数是正确的:
def fun(a, b=1,c=2): #a是“位置参数”,b和c被称为“键值参数”。
print(a, b, c)
但是下面函数是错误的:
def fun(a=0,b,c=2):
print(a, b, c)
第10堂课,内容为Python变量和函数调用,以及函数默认参数。
本页面(?p=10)的实际上课时间为2020年4月28日第2小节课。
后面这两个小节课(“p=11”和“p=12”),是“实训课”,基本没有讲理论,直接删除这两“p”(webPage),直接跳到“p=13”。
粗略提及“p=11”和“p=12”的内容:
- 第一个是计算最大公因数与最小公倍数
- 第二个是用两个自定义函数和两个全局变量,将输入和输出分开
- 第三个是用自定义函数验证哥德巴赫猜想,使程序简洁
- 第四个是在cmd里面,用print函数了解“help()”函数
- 最后下课之前,提到了交作业的程序的第一行代码要“print("自己的姓名")”
本“p”结束,下一“p”为“p=13”。