六、练习
1.实现计算求最大公约数和最小公倍数的函数
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
def lcm(x, y):
return x * y // gcd(x, y)
给x,y判断大小,以小
(x, y) = (y, x) if x > y else (x, y),这个容易忘。
2.实现判断一个数是不是回文数的函数
def is_palindrome(num):
temp = num
total = 0
while temp > 0:
total = total * 10 + temp % 10
temp //= 10
return total == num
设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。
3.实现判断一个数是不是素数的函数
def is_prime(num):
for factor in range(2, num):
if num % factor == 0:
return False
return True if num != 1 else False
4.写一个程序判断输入的正整数是不是回文数
def is_palindrome(num):
temp = num
total = 0
while temp > 0:
total = total * 10 + temp % 10
temp //= 10
return total == num
def is_prime(num):
for factor in range(2, num):
if num % factor == 0:
return False
return True if num != 1 else False
if __name__ == '__main__':
num = int(input('请输入正整数: '))
if is_palindrome(num) and is_prime(num):
print('%d是回文素数' % num)
else:
print('%d不是回文素数' % num)
解读 if __name__ == '__main__':
这段代码的主要作用主要是让该python文件既可以独立运行,也可以当做模块导入到其他文件。当导入到其他的脚本文件的时候,此时__name__的名字其实是导入模块的名字,不是'__main__', main代码里面的就不执行了。
七、变量作用域问题
def foo():
b = 'hello'
def bar(): # Python中可以在函数内部再定义函数
c = True
print(a)
print(b)
print(c)
bar()
# print(c) # NameError: name 'c' is not defined
if __name__ == '__main__':
a = 100
# print(b) # NameError: name 'b' is not defined
foo()
执行结果
a是一个全局变量,全局作用域。都可以访问。
b定义在函数中的局部变量,局部作用域。foo函数和bar函数可以访问。
c也是局部作用域,只有bar函数可以访问。
局部作用域、嵌套作用域、全局作用域、内置作用域
例子:
def foo():
a = 200
print(a) # 200
if __name__ == '__main__':
a = 100
foo()
print(a) # 100
这时foo函数中的变量a的被重新定义的局部变量a
和全局作用域的a不是同一个
可以把foo函数的变量a改成全局变量
def foo():
global a
a = 200
print(a) # 200
if __name__ == '__main__':
a = 100
foo()
print(a) # 200
此时输出的a值都为200
规范书写:
def main():
# Todo: Add your code here
pass
if __name__ == '__main__':
main()