大纲
局部变量和全局全量
在函数内部的变量是局部变量,它只在本函数范围内有效,在函数外部定义的变量是全局变量,它可以在程序中所有地方有效。
def redefine():
x = 20
print(x)
在上面函数的内部定义的x,虽然名字一样,但是只能在函数内部起作用,所以最终在函数外部打印x的时候,输出的还是10。
def max_xy(x,y):
x = 20
y = 10
if x>y:
return 0
else:
return 1
max_xy(x,y)
在上面这个函数中,内部重新定义了x和y的值,所以比较它们的大小是x比y大。
def max_xy(x,y):
if x>y:
return 0
else:
return 1
max_xy(x,y)
这个函数是正常使用形参,将实参x,y引入函数逻辑进行计算。
def max_xy():
x = 30
if x>y:
return 0
else:
return 1
max_xy()
这个函数中没有形参,当函数内部要进行变量运算时,会首先看需要的变量在函数内有没有定义,如果没有的话,去找对应名字的全局变量。
哥赫巴德猜想
此猜想是指:任务一个偶数都可以表示成两个质数之和。比如8=3+5,下面我们来写一个程序,来验证4-100之间的偶数都可以分解成两个质数之和。
def prime(x):
if x in [0,1]:
return False
for i in range(2,x):
if x%i==0:
return False
return True
for i in range(4,101,2):
for j in range(2,i):
if prime(j) and prime(i-j):
print("{i}={a}+{b}".format(i=i,a=j,b=i-j))
break
4=2+2
6=3+3
8=3+5
10=3+7
12=5+7
14=3+11
16=3+13
18=5+13
20=3+17
22=3+19
24=5+19
26=3+23
28=5+23
30=7+23
32=3+29
34=3+31
36=5+31
38=7+31
40=3+37
42=5+37
44=3+41
46=3+43
48=5+43
50=3+47
52=5+47
54=7+47
56=3+53
58=5+53
60=7+53
62=3+59
64=3+61
66=5+61
68=7+61
70=3+67
72=5+67
74=3+71
76=3+73
78=5+73
80=7+73
82=3+79
84=5+79
86=3+83
88=5+83
90=7+83
92=3+89
94=5+89
96=7+89
98=19+79
100=3+97
练习:找第n大的数
定义一个函数,利用它输入一组元素中第n大的数字。
def max_n(li,n):
for i in li:
m = 0
for j in li:
if i<j:
m = m+1
if m == n-1:
return i
x = [99,200,95,87,-12,30,87,75,-25]
for n in range(1,len(li)+1):
print(max_n(li,n))
200
99
95
87
None
75
30
-12
-25
处理列表的注意点
列表实际上是存放在内存中的一串元素,列表的名字可以认为是一个指向标签,修改一个列表可能会影响另一个。
[99, 2, 3]
[99, 2, 3]
通过id函数可以看到,x和y这两个列表实际上是同一个,修改了其中一个,另一个会自动修改。
x = [1,2,3]
y = x.copy()
x[0] = 99
print(x)
print(y)
如果我们要让两个列表不一样,需要使用copy命令。这样id就不一样了
下面我们来看一个在函数中使用列表的常见错误。函数的目的是在一个列表中插入一些数字。
def list_append(x,li=[]):
for i in range(x):
li.append(i*i)
print(li)
[0, 1, 4, 0, 1, 4, 9]
上面两次调用中,都没有传递新的列表(使用默认列表 li),程序会调用定义函数时保存的默认参数(li);列表在append的时候会在 li原来的基础上append追加值,所以会产生以上结果.
def list_append(x, li=[]):
if not li:# 如果li不为空的话,就清空列表
li = []
for i in range(x):
li.append(i * i)
print(li)