|
@@ -77,14 +77,14 @@ def roll_dice(n=2):
|
|
|
:param n: 色子的个数
|
|
:param n: 色子的个数
|
|
|
:return: n颗色子点数之和
|
|
:return: n颗色子点数之和
|
|
|
"""
|
|
"""
|
|
|
- total = 0
|
|
|
|
|
- for _ in range(n):
|
|
|
|
|
- total += randint(1, 6)
|
|
|
|
|
- return total
|
|
|
|
|
|
|
+ total = 0
|
|
|
|
|
+ for _ in range(n):
|
|
|
|
|
+ total += randint(1, 6)
|
|
|
|
|
+ return total
|
|
|
|
|
|
|
|
|
|
|
|
|
def add(a=0, b=0, c=0):
|
|
def add(a=0, b=0, c=0):
|
|
|
- return a + b + c
|
|
|
|
|
|
|
+ return a + b + c
|
|
|
|
|
|
|
|
|
|
|
|
|
# 如果没有指定参数那么使用默认值摇两颗色子
|
|
# 如果没有指定参数那么使用默认值摇两颗色子
|
|
@@ -107,10 +107,10 @@ print(add(c=50, a=100, b=200))
|
|
|
# 在参数名前面的*表示args是一个可变参数
|
|
# 在参数名前面的*表示args是一个可变参数
|
|
|
# 即在调用add函数时可以传入0个或多个参数
|
|
# 即在调用add函数时可以传入0个或多个参数
|
|
|
def add(*args):
|
|
def add(*args):
|
|
|
- total = 0
|
|
|
|
|
- for val in args:
|
|
|
|
|
- total += val
|
|
|
|
|
- return total
|
|
|
|
|
|
|
+ total = 0
|
|
|
|
|
+ for val in args:
|
|
|
|
|
+ total += val
|
|
|
|
|
+ return total
|
|
|
|
|
|
|
|
|
|
|
|
|
print(add())
|
|
print(add())
|
|
@@ -126,11 +126,11 @@ print(add(1, 3, 5, 7, 9))
|
|
|
|
|
|
|
|
```Python
|
|
```Python
|
|
|
def foo():
|
|
def foo():
|
|
|
- print('hello, world!')
|
|
|
|
|
|
|
+ print('hello, world!')
|
|
|
|
|
|
|
|
|
|
|
|
|
def foo():
|
|
def foo():
|
|
|
- print('goodbye, world!')
|
|
|
|
|
|
|
+ print('goodbye, world!')
|
|
|
|
|
|
|
|
|
|
|
|
|
# 下面的代码会输出什么呢?
|
|
# 下面的代码会输出什么呢?
|
|
@@ -237,45 +237,45 @@ import module3
|
|
|
|
|
|
|
|
```Python
|
|
```Python
|
|
|
def gcd(x, y):
|
|
def gcd(x, y):
|
|
|
- (x, y) = (y, x) if x > y else (x, y)
|
|
|
|
|
- for factor in range(x, 0, -1):
|
|
|
|
|
- if x % factor == 0 and y % factor == 0:
|
|
|
|
|
- return factor
|
|
|
|
|
|
|
+ (x, y) = (y, x) if x > y else (x, y)
|
|
|
|
|
+ for factor in range(x, 0, -1):
|
|
|
|
|
+ if x % factor == 0 and y % factor == 0:
|
|
|
|
|
+ return factor
|
|
|
|
|
|
|
|
|
|
|
|
|
def lcm(x, y):
|
|
def lcm(x, y):
|
|
|
- return x * y // gcd(x, y)
|
|
|
|
|
|
|
+ return x * y // gcd(x, y)
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
#### 练习2:实现判断一个数是不是回文数的函数。
|
|
#### 练习2:实现判断一个数是不是回文数的函数。
|
|
|
|
|
|
|
|
```Python
|
|
```Python
|
|
|
def is_palindrome(num):
|
|
def is_palindrome(num):
|
|
|
- temp = num
|
|
|
|
|
- total = 0
|
|
|
|
|
- while temp > 0:
|
|
|
|
|
- total = total * 10 + temp % 10
|
|
|
|
|
- temp //= 10
|
|
|
|
|
- return total == num
|
|
|
|
|
|
|
+ temp = num
|
|
|
|
|
+ total = 0
|
|
|
|
|
+ while temp > 0:
|
|
|
|
|
+ total = total * 10 + temp % 10
|
|
|
|
|
+ temp //= 10
|
|
|
|
|
+ return total == num
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
#### 练习3:实现判断一个数是不是素数的函数。
|
|
#### 练习3:实现判断一个数是不是素数的函数。
|
|
|
|
|
|
|
|
```Python
|
|
```Python
|
|
|
def is_prime(num):
|
|
def is_prime(num):
|
|
|
- for factor in range(2, num):
|
|
|
|
|
- if num % factor == 0:
|
|
|
|
|
- return False
|
|
|
|
|
- return True if num != 1 else False
|
|
|
|
|
|
|
+ for factor in range(2, num):
|
|
|
|
|
+ if num % factor == 0:
|
|
|
|
|
+ return False
|
|
|
|
|
+ return True if num != 1 else False
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
#### 练习4:写一个程序判断输入的正整数是不是回文素数。
|
|
#### 练习4:写一个程序判断输入的正整数是不是回文素数。
|
|
|
|
|
|
|
|
```Python
|
|
```Python
|
|
|
if __name__ == '__main__':
|
|
if __name__ == '__main__':
|
|
|
- num = int(input('请输入正整数: '))
|
|
|
|
|
- if is_palindrome(num) and is_prime(num):
|
|
|
|
|
- print('%d是回文素数' % num)
|
|
|
|
|
|
|
+ num = int(input('请输入正整数: '))
|
|
|
|
|
+ if is_palindrome(num) and is_prime(num):
|
|
|
|
|
+ print('%d是回文素数' % num)
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
通过上面的程序可以看出,当我们将代码中重复出现的和相对独立的功能抽取成函数后,我们可以组合使用这些函数来解决更为复杂的问题,这也是我们为什么要定义和使用函数的一个非常重要的原因。
|
|
通过上面的程序可以看出,当我们将代码中重复出现的和相对独立的功能抽取成函数后,我们可以组合使用这些函数来解决更为复杂的问题,这也是我们为什么要定义和使用函数的一个非常重要的原因。
|
|
@@ -284,22 +284,22 @@ if __name__ == '__main__':
|
|
|
|
|
|
|
|
```Python
|
|
```Python
|
|
|
def foo():
|
|
def foo():
|
|
|
- b = 'hello'
|
|
|
|
|
|
|
+ b = 'hello'
|
|
|
|
|
|
|
|
- def bar(): # Python中可以在函数内部再定义函数
|
|
|
|
|
|
|
+ def bar(): # Python中可以在函数内部再定义函数
|
|
|
c = True
|
|
c = True
|
|
|
print(a)
|
|
print(a)
|
|
|
print(b)
|
|
print(b)
|
|
|
print(c)
|
|
print(c)
|
|
|
|
|
|
|
|
- bar()
|
|
|
|
|
|
|
+ bar()
|
|
|
# print(c) # NameError: name 'c' is not defined
|
|
# print(c) # NameError: name 'c' is not defined
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if __name__ == '__main__':
|
|
|
- a = 100
|
|
|
|
|
|
|
+ a = 100
|
|
|
# print(b) # NameError: name 'b' is not defined
|
|
# print(b) # NameError: name 'b' is not defined
|
|
|
- foo()
|
|
|
|
|
|
|
+ foo()
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
上面的代码能够顺利的执行并且打印出100和“hello”,但我们注意到了,在`bar`函数的内部并没有定义`a`和`b`两个变量,那么`a`和`b`是从哪里来的。我们在上面代码的`if`分支中定义了一个变量`a`,这是一个全局变量(global variable),属于全局作用域,因为它没有定义在任何一个函数中。在上面的`foo`函数中我们定义了变量`b`,这是一个定义在函数中的局部变量(local variable),属于局部作用域,在`foo`函数的外部并不能访问到它;但对于`foo`函数内部的`bar`函数来说,变量`b`属于嵌套作用域,在`bar`函数中我们是可以访问到它的。`bar`函数中的变量`c`属于局部作用域,在`bar`函数之外是无法访问的。事实上,Python查找一个变量时会按照“局部作用域”、“嵌套作用域”、“全局作用域”和“内置作用域”的顺序进行搜索,前三者我们在上面的代码中已经看到了,所谓的“内置作用域”就是Python内置的那些隐含标识符`min`、`len`等都属于内置作用域)。
|
|
上面的代码能够顺利的执行并且打印出100和“hello”,但我们注意到了,在`bar`函数的内部并没有定义`a`和`b`两个变量,那么`a`和`b`是从哪里来的。我们在上面代码的`if`分支中定义了一个变量`a`,这是一个全局变量(global variable),属于全局作用域,因为它没有定义在任何一个函数中。在上面的`foo`函数中我们定义了变量`b`,这是一个定义在函数中的局部变量(local variable),属于局部作用域,在`foo`函数的外部并不能访问到它;但对于`foo`函数内部的`bar`函数来说,变量`b`属于嵌套作用域,在`bar`函数中我们是可以访问到它的。`bar`函数中的变量`c`属于局部作用域,在`bar`函数之外是无法访问的。事实上,Python查找一个变量时会按照“局部作用域”、“嵌套作用域”、“全局作用域”和“内置作用域”的顺序进行搜索,前三者我们在上面的代码中已经看到了,所谓的“内置作用域”就是Python内置的那些隐含标识符`min`、`len`等都属于内置作用域)。
|
|
@@ -308,29 +308,29 @@ if __name__ == '__main__':
|
|
|
|
|
|
|
|
```Python
|
|
```Python
|
|
|
def foo():
|
|
def foo():
|
|
|
- a = 200
|
|
|
|
|
- print(a) # 200
|
|
|
|
|
|
|
+ a = 200
|
|
|
|
|
+ print(a) # 200
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if __name__ == '__main__':
|
|
|
- a = 100
|
|
|
|
|
- foo()
|
|
|
|
|
- print(a) # 100
|
|
|
|
|
|
|
+ a = 100
|
|
|
|
|
+ foo()
|
|
|
|
|
+ print(a) # 100
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
在调用`foo`函数后,我们发现`a`的值仍然是100,这是因为当我们在函数`foo`中写`a = 200`的时候,是重新定义了一个名字为`a`的局部变量,它跟全局作用域的`a`并不是同一个变量,因为局部作用域中有了自己的变量`a`,因此`foo`函数不再搜索全局作用域中的`a`。如果我们希望在`foo`函数中修改全局作用域中的`a`,代码如下所示。
|
|
在调用`foo`函数后,我们发现`a`的值仍然是100,这是因为当我们在函数`foo`中写`a = 200`的时候,是重新定义了一个名字为`a`的局部变量,它跟全局作用域的`a`并不是同一个变量,因为局部作用域中有了自己的变量`a`,因此`foo`函数不再搜索全局作用域中的`a`。如果我们希望在`foo`函数中修改全局作用域中的`a`,代码如下所示。
|
|
|
|
|
|
|
|
```Python
|
|
```Python
|
|
|
def foo():
|
|
def foo():
|
|
|
- global a
|
|
|
|
|
- a = 200
|
|
|
|
|
- print(a) # 200
|
|
|
|
|
|
|
+ global a
|
|
|
|
|
+ a = 200
|
|
|
|
|
+ print(a) # 200
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if __name__ == '__main__':
|
|
|
- a = 100
|
|
|
|
|
- foo()
|
|
|
|
|
- print(a) # 200
|
|
|
|
|
|
|
+ a = 100
|
|
|
|
|
+ foo()
|
|
|
|
|
+ print(a) # 200
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
我们可以使用`global`关键字来指示`foo`函数中的变量`a`来自于全局作用域,如果全局作用域中没有`a`,那么下面一行的代码就会定义变量`a`并将其置于全局作用域。同理,如果我们希望函数内部的函数能够修改嵌套作用域中的变量,可以使用`nonlocal`关键字来指示变量来自于嵌套作用域,请大家自行试验。
|
|
我们可以使用`global`关键字来指示`foo`函数中的变量`a`来自于全局作用域,如果全局作用域中没有`a`,那么下面一行的代码就会定义变量`a`并将其置于全局作用域。同理,如果我们希望函数内部的函数能够修改嵌套作用域中的变量,可以使用`nonlocal`关键字来指示变量来自于嵌套作用域,请大家自行试验。
|
|
@@ -350,4 +350,3 @@ def main():
|
|
|
if __name__ == '__main__':
|
|
if __name__ == '__main__':
|
|
|
main()
|
|
main()
|
|
|
```
|
|
```
|
|
|
-
|
|
|