1)让用户输入任意两个整数相乘的内容(如“2*3”) 能输出“2*3=6”,比如运行情况为:
让我们一步一步完成。先完成输入:
strs = input()
假设我们输入的是“2*3”,那么现在首先就需要将星号前后的两个数值拆分出来。这个可以利用字符串自带的split函数来实现:
strs = input()
print(strs.split('*'))
运行结果为:
看得出,split方法会以圆括号中指定的字符来分割当前字符串,并得到前后两个字符串,分别是‘2’和‘3’。两个数值构成一个列表,因此可以通过列表元素分别得到:
strs = input()
num = strs.split('*')
print(num[0], num[1])
运行结果为:
也可以使用这样的写法分别获取前后两个分割出来的数值:
strs = input()
a, b = strs.split('*')
print(a, b)
运行结果为:
此时的结果不再是列表,就是两个字符串类型的变量值。
请注意,这个‘2’和‘3’都是字符类型,因此不可以直接代数运算:
strs = input()
a, b = strs.split('*')
print(a * b)
运行结果有错误,错误信息是说不能对非整数进行乘积运算:
因此需要转换整数后进行代数运算:
strs = input()
a, b = strs.split('*')
print(int(a) * int(b))
运行结果为:
这个结果就是我们准备输出结果的尾部内容。因此可以将以前输入的内容拼接到这个结果前面,不就形成了最终所要的样子了吗?
strs = input()
a, b = strs.split('*')
print(strs + int(a) * int(b))
运行结果有错误,错误信息是说只能将字符连接到字符上:
原因很简单,strs为字符串,int(a)是整数,当然不能直接相加。进一步完善为:
strs = input()
a, b = strs.split('*')
print(strs + str(int(a) * int(b)))
运行结果为:
仔细观察可以发现,最后的输出少了个等于号,再次修改为:
strs = input()
a, b = strs.split('*')
print(strs + '=' + str(int(a) * int(b)))
运行结果为:
当然也可以写成:
strs = input()
a, b = strs.split('*')
print(a + '*' + b + '=' + str(int(a) * int(b)))
输出内容同上。这个有点麻烦,但是效果一样。
除了这些方法外,我们还可以使用另外一种完全不一样的方法:
strs = input()
print(strs + '=' + str(eval(strs)))
如果输入“2*3”,运行结果为:
如何理解呢?eval函数可以对参数字符串进行直接替换,并嵌入在当前代码中。比如如果输入“2*3”,则eval(strs)就是2*3,此时它的内容中前后并没有引号,因此上述最后一行语句
print(strs + '=' + str(eval(strs)))
替换变为:
print(strs + '=' + str(2 * 3))
正好就是可以直接执行的正确语句!
2)计算相似度:
这是著名的余弦相似度,可以计算两个向量之间的距离。比如:
我们写出了第一个代码:
v11 = 1
v12 = 2
v21 = 3
v22 = 4
fenzi = v11 * v21 + v12 * v22
fenmu = (v11 ** 2 + v12 ** 2) ** 0.5 * (v21 ** 2 + v22 ** 2) ** 0.5
print(fenzi / fenmu)
输出为: 0.9838699100999074
虽然写法看起来很复杂,其实简单,就是按照计算公式将各种常见的代数运算表达出来,大家可以仔细观察。
对于平方和开方,也可以使用math模块中的函数来完成:
import math
v11 = 1
v12 = 2
v21 = 3
v22 = 4
fenzi = v11 * v21 + v12 * v22
fenmu = math.sqrt(math.pow(v11, 2) + math.pow(v12, 2)) * \
math.sqrt(math.pow(v21, 2) + math.pow(v22, 2))
print(fenzi / fenmu)
输出内容同上。其中,sqrt为开方函数,pow为乘幂函数,圆括号中的第二个参数表示平方。一个细节请注意,由于fenmu表达式很长,使用了 \ 换行符,这个符号表示下一行仍然是接在这句代码的后面,只是为了避免一行显示过长的内容。