Python for Kids
  • 0 前言
  • 1 编程环境准备
  • 2 运算符和表达式
  • 3 掌握变量
  • 4 字符串
  • 5 获取用户的输入
  • 6 条件判断
  • 7 条件判断实操
  • 8 FOR循环
  • 9 循环和列表
  • 10 WHILE循环
  • 11 WHILE循环实操
  • 12 WHILE循环再实操
  • 13 多重循环
  • 14 再谈列表
  • 15 初见函数
  • 16 函数实操
  • 17 选择排序
  • 18 冒泡排序
  • 19 递归算法之一
  • 20 递归算法实操
  • 21 快速排序
  • 22 汉诺塔游戏
  • 23 递推算法
  • 24 分治算法
  • 25 集合与组合
  • 26 贪心算法
  • 27 字典和键值对
  • 28 广度优先搜索算法
  • 29 数组和向量化计算
  • 30 随机和模拟
  • 31 数据可视化
  • 32 文件读取和分析
Powered by GitBook
On this page
  • 大纲
  • 局部变量和全局全量
  • 哥赫巴德猜想
  • 练习:找第n大的数
  • 处理列表的注意点

Was this helpful?

16 函数实操

继续练习吧少年

大纲

  • 局部变量和全局变量

  • 练习:哥赫巴德猜想

  • 练习:找第n大的数

  • 处理列表的注意点

局部变量和全局全量

在函数内部的变量是局部变量,它只在本函数范围内有效,在函数外部定义的变量是全局变量,它可以在程序中所有地方有效。

x = 10
y = 20
def redefine():
    x = 20
    print(x)
redefine()
print(x)
20
10

在上面函数的内部定义的x,虽然名字一样,但是只能在函数内部起作用,所以最终在函数外部打印x的时候,输出的还是10。

def max_xy(x,y):
    x = 20
    y = 10
    if x>y:
        return 0
    else:
        return 1
max_xy(x,y)
0

在上面这个函数中,内部重新定义了x和y的值,所以比较它们的大小是x比y大。

def max_xy(x,y):
    if x>y:
        return 0
    else:
        return 1
max_xy(x,y)
1

这个函数是正常使用形参,将实参x,y引入函数逻辑进行计算。

def max_xy():
    x = 30
    if x>y:
        return 0
    else:
        return 1
max_xy()
0

这个函数中没有形参,当函数内部要进行变量运算时,会首先看需要的变量在函数内有没有定义,如果没有的话,去找对应名字的全局变量。

哥赫巴德猜想

此猜想是指:任务一个偶数都可以表示成两个质数之和。比如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]
max_n(x,2)
99
for n in range(1,len(li)+1):
    print(max_n(li,n))
200
99
95
87
None
75
30
-12
-25

处理列表的注意点

列表实际上是存放在内存中的一串元素,列表的名字可以认为是一个指向标签,修改一个列表可能会影响另一个。

x = [1,2,3]
y = x
x[0] = 99
print(x)
print(y)
[99, 2, 3]
[99, 2, 3]
id(x)
2192083872136
id(y)
2192083872136

通过id函数可以看到,x和y这两个列表实际上是同一个,修改了其中一个,另一个会自动修改。

x = [1,2,3]
y = x.copy()
x[0] = 99
print(x)
print(y)
[99, 2, 3]
[1, 2, 3]
id(x)
2192083605384
id(y)
2192083878792

如果我们要让两个列表不一样,需要使用copy命令。这样id就不一样了

下面我们来看一个在函数中使用列表的常见错误。函数的目的是在一个列表中插入一些数字。

def list_append(x,li=[]):
    for i in range(x):
        li.append(i*i)
    print(li)
list_append(3)
[0, 1, 4]
list_append(4)
[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)
list_append(3)
[0, 1, 4]
list_append(4)
[0, 1, 4, 9]
Previous15 初见函数Next17 选择排序

Last updated 4 years ago

Was this helpful?