我们通过实验已经学习了基本的 Python 3 语法。现在我们就来用一个挑战来巩固一下我们的实验效果。
本挑战中,我们将实现一个程序用来计算半径为 2 的圆的面积并打印输出。
提示语
import math
使用 format 可以控制输出的小数位数,可以使用 ‘{:.10f}’.format() 来进行格式化输出保留 10 位小数
注意代码文件的路径必须是 /home/shiyanlou/Code/CircleArea.py
请不要使用 input 获取输入,程序执行不需要任何输入的参数
import math
# 计算圆的面积
area = 2 * 2 * math.pi
# 格式化输出圆的面积,保留10位小数
print("{:.10f}".format(area))
控制流 If-else
网址
https://www.lanqiao.cn/courses/596/learning/?id=2039
if x:
pass
不要像下面这样做:
if x == True:
pass
while 循环
while condition:
statement1
statement2
想要多次执行的代码必须以正确的缩进放在 while 语句下面。在表达式 condition 为真的时候它们才会执行。同 if-else 一样,非零值为真。启动 python3 交互页面,让我们写一个简单的代码,它按顺序打印 0 到 10 的数字:
>>> n = 0
>>> while n < 11:
... print(n)
... n += 1
...
0
1
2
3
4
5
6
7
8
9
10
在第一行我们使 n = 0,然后在 while 语句中把条件设置为 n < 11,这意味着在 while 语句下面缩进的所有行将会被执行,直到 n 的值大于等于 11。在循环里我们只是打印 n 的值然后令它增一。
想想如果没有循环语句,你想要打印 0 到 10 的所有数字,那你得手动打印 11 次!
让我们来试试打印斐波那契数列。这个数列前两项为 1,之后的每一个项都是前两项之和。所以这个数列看起来就像这样: 1,1,2,3,5,8,13,…。
第一行代码中我们初始化 a 和 b。当 b 的值小于 100 的时候,循环执行代码。循环里我们首先打印 b 的值,然后在下一行将 a + b 的值赋值给 b,b 的值赋值给 a。
学习其他语言的同学在这里可能有些困惑,你可以这样理解,Python 中赋值语句执行时会先对赋值运算符右边的表达式求值,然后将这个值赋值给左边的变量。
默认情况下,print() 除了打印你提供的字符串之外,还会打印一个换行符,所以每调用一次 print() 就会换一次行,如同上面一样。
你可以通过 print() 的另一个参数 end 来替换这个换行符,就像下面这样,下面的程序写入 /home/shiyanlou/fibonacci2.py:
#!/usr/bin/env python3
a, b = 0, 1
while b < 100:
print(b, end=' ')
a, b = b, a + b
print()
我们来写一个程序计算幂级数:e^x = 1 + x + x^2 / 2! + x^3 / 3! + … + x^n / n! (0 < x < 1)。
该程序写入代码文件 /home/shiyanlou/powerseries.py
#!/usr/bin/env python3
x = float(input("Enter the value of x: "))
n = term = num = 1
result = 1.0
while n <= 100:
term *= x / n
result += term
n += 1
if term < 0.0001:
break
print("No of Times= {} and Sum= {}".format(n, result))
这个程序里我们介绍一个新的关键字 break,它可以终止最里面的循环。这个例子里我们在 if 语句里使用 break:
if term < 0.0001:
break
copy
这意味着如果 term 的值小于 0.0001,那么终止循环。
这个例子里我们打印 10 以内的乘法表。写入代码文件 /home/shiyanlou/multiplication.py:
#!/usr/bin/env python3
i = 1
print("-" * 50)
while i < 11:
n = 1
while n <= 10:
print("{:5d}".format(i * n), end=' ')
n += 1
print()
i += 1
print("-" * 50)
这里我们在 while 循环里使用了另一个 while 循环,这被称为嵌套循环。你应该已经看到一条有趣的语句:
print("-" * 50)
copy
字符串若是乘上整数 n,将返回由 n 个此字符串拼接起来的新字符串。
下面是一些例子:
‘s’ * 10
‘ssssssssss’print("*" * 10)
print("#" * 20)
####################print("–" * 20)
print("-" * 40)
对上面的列表, a[0:5] 用数学表达式可以写为 [0,5) ,其索引取值为 0,1,2,3,4,所以能将a中所有值获取到。 你也可以用a[:5], 效果是一样的。
列表
>>> a = [ 1, 342, 223, 'India', 'Fedora']
>>> a
[1, 342, 223, 'India', 'Fedora']
>>> a[0]
1
>>> a[4]
'Fedora'
>>> a[-1]
'Fedora'
>>> a[0:-1]
[1, 342, 223, 'India']
>>> a[2:-2]
[223]
>>> a[:]
[1, 342, 223, 'India', 'Fedora']
>>> a[:-2]
[1, 342, 223]
>>> a[-2:]
['India', 'Fedora']
而a[-5:-1],因为左闭右开原则,其取值为 -5,-4,-3,-2 是不包含 -1 的。
为了取到最后一个值,你可以使用 a[-5:] ,它代表了取该列表最后 5 个值。
试图使用太大的索引会导致错误:
Python 能够优雅地处理那些没有意义的切片索引:一个过大的索引值(即大于列表实际长度)将被列表实际长度所代替,当上边界比下边界大时(即切片左值大于右值)就返回空列表:
>>> a[2:32]
[223, 'India', 'Fedora']
>>> a[32:]
[]
>>> a[1::2]
[342, 'India']
它的意思是,从切片索引 1 到列表末尾,每隔两个元素取值。
列表也支持连接这样的操作,它返回一个新的列表:
for 循环
通过 for 语句我们可以使用 for 循环。Python 里的 for 循环与 C 语言中的不同。这里的 for 循环遍历任何序列(比如列表和字符串)中的每一个元素。下面给出示例:
>>> a = ['ShiYanLou', 'is', 'powerful']
>>> for x in a:
... print(x)
...
ShiYanLou
is
powerful
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> for x in a[::2]:
... print(x)
1
3
5
7
9
range() 函数
如果你需要一个数值序列,内置函数 range() 会很方便,它生成一个等差数列(并不是列表):
>>> for i in range(5):
... print(i)
...
0
1
2
3
4
>>> range(1, 5)
range(1, 5)
>>> list(range(1, 5))
[1, 2, 3, 4]
>>> list(range(1, 15, 3))
[1, 4, 7, 10, 13]
>>> list(range(4, 15, 2))
[4, 6, 8, 10, 12, 14]
如同 break ,我们可以在循环中使用另一个语句 continue。它会跳过其后的代码回到循环开始处执行。这意味着它可以帮助你跳过部分循环。在下面的例子中,我们要求用户输入一个整数,如果输入的是负数,那么我们会再次要求输入,如果输入的是整数,我们计算这个数的平方。用户输入 0 来跳出这个无限循环。
#!/usr/bin/env python3
while True:
n = int(input("Please enter an Integer: "))
if n < 0:
continue # 这会返回到循环开始处执行
elif n == 0:
break
print("Square is ", n ** 2)
print("Goodbye")
循环的 else 语句
我们可以在循环后面使用可选的 else 语句。它将会在循环完毕后执行,除非有 break 语句终止了循环
>>> for i in range(0, 5):
... print(i)
... else:
... print("Bye bye")
...
0
1
2
3
4
Bye bye
这是一个非常简单的游戏。这里有 21 根棍子,首先用户选 1 到 4 根棍子,然后电脑选 1 到 4 根棍子。谁选到最后一根棍子谁就输。判断一下用户有赢的机会吗?如果没有的话,如何修改游戏规则可以使用户有赢的机会呢?
特别说明:用户和电脑一次选的棍子总数只能是 5。
#!/usr/bin/env python3
sticks = 21
print("There are 21 sticks, you can take 1-4 number of sticks at a time.")
print("Whoever will take the last stick will lose")
while True:
print("Sticks left: " , sticks)
if sticks == 1:
print("You took the last stick, you lose")
break
sticks_taken = int(input("Take sticks(1-4):"))
if sticks_taken >= 5 or sticks_taken <= 0:
print("Wrong choice")
continue
print("Computer took: " , (5 - sticks_taken) , "\n")
sticks -= 5
这个实验中我们了解了两种循环:while 和 for 循环,其中的 for 循环我们通常与 range() 函数配合使用,要特别注意的是,range() 函数返回的并不是列表而是一种可迭代对象:
python 中 for 循环的 else 子句给我们提供了检测循环是否顺利执行完毕的一种优雅方法。
列表推导式
本节实验将会通过两个实例程序来熟悉 Python3 的基本数据结构:
判断学生成绩是否达标的程序
计算两个矩阵的 Hadamard 乘积
这是一个判断学生成绩是否达标的程序,要求输入学生数量,以及各个学生物理、数学、历史三科的成绩,如果总成绩小于 120,程序打印 “failed”,否则打印 “passed”。
代码写入 /home/shiyanlou/students.py 文件:
#!/usr/bin/env python3
n = int(input("Enter the number of students: "))
data = {} # 用来存储数据的字典变量
Subjects = ('Physics', 'Maths', 'History') # 所有科目
for i in range(0, n):
name = input('Enter the name of the student {}: '.format(i + 1)) # 获得学生名称
marks = []
for x in Subjects:
marks.append(int(input('Enter marks of {}: '.format(x)))) # 获得每一科的分数
data[name] = marks
for x, y in data.items():
total = sum(y)
print("{}'s total marks {}".format(x, total))
if total < 120:
print(x, "failed :(")
else:
print(x, "passed :)")
这个例子里我们计算两个矩阵的 Hadamard 乘积。要求输入矩阵的行/列数(在这里假设我们使用的是 n × n 的矩阵)。
代码写入 /home/shiyanlou/matrixmul.py 文件:
#!/usr/bin/env python3
n = int(input("Enter the value of n: "))
print("Enter values for the Matrix A")
a = []
for i in range(n):
a.append([int(x) for x in input().split()])
print("Enter values for the Matrix B")
b = []
for i in range(n):
b.append([int(x) for x in input().split()])
c = []
for i in range(n):
c.append([a[i][j] * b[i][j] for j in range(n)])
print("After matrix multiplication")
print("-" * 7 * n)
for x in c:
for y in x:
print(str(y).rjust(5), end=' ')
print()
print("-" * 7 * n)
这里我们使用了几次列表推导式。[int(x) for x in input().split()] 首先通过 input() 获得用户输入的字符串,再使用 split() 分割字符串得到一系列的数字字符串,然后用 int() 从每个数字字符串创建对应的整数值。我们也使用了 [a[i][j] * b[i][j] for j in range(n)] 来得到矩阵乘积的每一行数据。
python中,(x for y in z for x in y)这个结构怎么理解?
https://blog.csdn.net/weixin_42427638/article/details/85261284