这节课的项目是小费计算器。
1 基本数据类型
上个教程我们学习了使用len()函数计算字符串的长度,比如我们输入print(len("hello")),运行之后输出的长度是5,如果我们在len()函数中输入一个数字会怎么样呢,print(len(12345)),当你运行这个语句的时候,控制台中就会输出一串错误描述, TypeError: object of type 'int' has no len(),为了理解这些错误是怎么造成的,我们首先要了解数据类型。第一天的时候我们已经学习了字符串类型,今天我们将探索其他的数据类型:String(字符串)、Integer(整数)、Float(浮点数)、Boolean(布尔值)。
1.1 String 字符串
我们已经学习了字符串,字符串就是由一堆字符组成的,例如:"Hello"这个单词是由5个字符组成的,我们可以取出这个单次的每个字符,我们只需要在"hello"这个字符串后面添加一对中括号,然后填入想要获取的字符的位置编号即可,例如:我们获取"hello"的第一个字符,我们可以这样写,"hello"[0]。使用print("hello"[0])就可以输出这个字符。在Python中序列的编号都是从0开始的,所以字符串第一个字符的编号就是0。如果我们将数字123作为字符串怎么处理呢,直接用双引号将数字123括起来就行了,"123",这样如果我们想要获取字符"3",就可以通过"123"[2]。如果我们输出print("123" +"456"),这个时候程序会直接将这两个字符串拼接在一起,"123456"。如果你想让123和456进行相加,你需要将这两个数字定义成整数类型。
1.2 Integer 整数
下面这个语句就会输出123和456的和,print(123 + 456)。有时候数字过长,我们会在数字中间插入逗号来将数字分隔开,方便理解数字,例如123456789可以写成123,456,789,在Python中你可以用类似的表示法来定义一个数字变量,只需要使用下划线替代逗号即可,123_456_789,计算机在运行代码的时候,会将下划线忽略掉,好处只是让我们能够更轻松的阅读数字。无论是正数还是负数在编程中都被称为Integer(整数)。那么小数我们怎么称呼呢?小数在编程中被称为Float(浮点数)。
1.3 Float 浮点数
例如π就是一个浮点数,它的值近似3.14159。
1.4 Boolean 布尔值
布尔值只有两个可能的值:True,False。这个数据类型在编程中被大量使用。
现在你已经看到了许多基本的数据类型,字符串、整数、浮点数、布尔值,下一节的测验看看你是否已经把这些知识编程你自己的了。
2 类型错误、类型检查和类型转换
之前我们在使用len()函数的时候遇到了一个类型错误提示,当我们尝试将数字12345放入len()函数中的时候,len(12345),运行之后你就会看到错误提示TypeError: object of type 'int' has no len(),下面我们来学习一点类型和函数有关的内容。函数就像一个处理特定东西的机器,当你放入正确的东西的时候,它就会正常产生对应的处理结果,当你放入错误的东西的时候,这个机器就会出现异常。在这里,我们将错误的数据类型变量放入了len()函数,所以产生了异常。在我们之前的代码挑战的时候,我们使用过len()函数计算名字。
num_char = len(input("What is your name?"))
print("Your name has " + num_char + " characters.")
我们运行上面这段代码的时候,会出现如下的错误 TypeError: can only concatenate str (not "int") to str,这个错误提示告诉我们只能使用字符串才能和字符串进行拼接,num_char是一个整数类型。那么我们怎样才能防止出现这类错误,怎么才能查看这些变量的数据类型呢?我们可以使用type()函数,这个函数会返回变量的数据类型。
print(type(num_char))
'''
<class 'int'>
'''
运行上面这段代码,就会输出num_char的数据类型是int。为了让num_char能和字符串进行拼接,我们需要将num_char的数据类型进行转换。我们可以使用str()函数,这个函数会将变量转换成字符串类型,所以我们可以将num_char变量传入str()函数中。
print("Your name has " + str(num_char) + " characters.")
类似的,我们可以使用float()函数将变量转化成浮点数。
a = 123
print(type(a))
a = float(123)
print(type(a))
'''
<class 'int'>
<class 'float'>
'''
3 数据类型练习
写一个程序,将一个两位数的整数每一位相加,例如:如果输入的数字是35,输出的结果应该是8,因为3 +5 = 8。
样例输入
39
样例输出
12
解释
3 + 9 = 12
解答
首先我们来获取一个两位数:
two_digit_number = input("输入一个两位数:")
这个时候我们查看一下two_digit_number的数据类型:
print(type(two_digit_number))
从type()函数返回的结果我们知道two_digit_number的数据类型是字符串,所以我们可以按照编号获取字符串中的每个字符,下面我们从two_digit_number中获取这个两位数的每一位数字:
number_1 = two_digit_number[0]
number_2 = two_digit_number[1]
然后我们查看一下number_1和number_2的数据类型:
print(type(number_1))
print(type(number_2))
运行上面这段代码我们知道,number_1和number_2的数据类型是字符串,为了计算这两个数字的和,我们需要将这两个变量的数据类型改为整数:
number_1 = int(two_digit_number[0])
number_2 = int(two_digit_number[1])
下面是完整的代码:
two_digit_number = input("输入一个两位数:")
number_1 = int(two_digit_number[0])
number_2 = int(two_digit_number[1])
print(number_1 + number_2)
如果你在完成这个代码挑战的过程中遇到任何问题,看一下之前的教程内容,然后再来进行这个代码挑战,你会得到很大的提升。
4 数学运算符
在上一个代码挑战中,你已经使用了加号(+)来计算两个数字之和,两数相减使用(-),相乘使用星号(*),两数相除使用(/)。
print(7 + 3)
print(7 - 3)
print(7 * 3)
print(7 / 3)
如果要计算一个输的N次方可以使用两个连接在一起的星号计算(**):
2 ** 2 # 2的2次方
8 ** 10 # 8的10次方
在数学中,运算符是有优先级顺序的,Python中每个算数运算符的优先级顺序如下:
()
**
* /
+ -
根据上面的算数运算符,你就可以知道下面这个算术表达式的计算过程和结果了:
print(3 * 3 + 3 / 3 - 3)
这个算数表达式的计算过程是:
3 * 3 = 9
3 / 3 = 1.0
9 + 1.0 = 10.0
10.0 - 3 = 7.0
你可以使用括号改变计算的优先级顺序,例如你想先计算3 + 3,你可以这么写:3 * (3 + 3)/ 3 - 3。
5 代码挑战:身体质量指数计算器
写一个程序,通过用户输入的提供和身高,计算身体质量指数。
身体质量指数(BMI)是由一个人的质量(体重)和身高计算出的一个数值,公式如下。
例如,一个身高高的人和一个身高矮的人有相同的体重,身高矮的人通常体重过高。
注意:计算结果需要进行四舍五入。
样例输入
weight = 80
height = 1.75
样例输出
26
解释
80 / (1.75 * 1.75) = 26.122448979591837
解答
首先我们要获取用户的身高和体重,我们可以使用input()函数来获取这两个值,因为input()函数的返回值是字符串,我们要进行算数运算,需要将字符串类型转换成整数或者浮点数,在这里我们将身高和体重的数据类型都转换成float。
height = float(input("输入你的身高(米):"))
weight = float(input("输入你的体重(千克):"))
根据公式,我们需要使用体重除以身高的平方,计算一个数字的平方我们可以使用运算符*。
bmi = weight / (height ** 2)
int()函数可以获取一个小数的整数部分,为了将结果四舍五入,我们将结果加上0.5,然后使用int()函数取整即可,你可以思考一下为什么这么做?下面是这个代码挑战完整的代码。
height = float(input("输入你的身高(米):"))
weight = float(input("输入你的体重(千克):"))
bmi = weight / (height ** 2)
print(int(bmi + 0.5))
6 数字操作和F字符串
上个代码挑战我们需要将一个小数进行四舍五入,我们使用的方法是先将小数加上0.5,然后使用int()函数取整,其实在Python中使用round()函数即可完成相同的操作。
print(round(8 / 3))
这个函数还可以传入第二个参数,来指定保留小数的位数,例如,保留2位小数:
print(8 / 3, 2)
当我们进行计算两个数相除的时候,使用type()函数查看计算结果你就会看到返回的float类型,即使是4 / 2,返回的也是2.0。我们也可以使用两个除号只获取整数部分:
print(4 / 2)
print(4 // 2)
‘’‘
2.0
2
’‘’
另外我们还有组合运算符,例如我们定义了一个变量a,将4赋值给变量a,然后将a除以2,并将结果再保存到变量a中,我们可以这样写:
a = 4
a = a / 2
使用组合运算符这样写:
a = 4
a /= 2
其他的组合运算符有:+=、-=、*=
如果我们想要执行如下的语句:
score = 0
print("your score is " + score)
会出现类型错误,字符串不能和数字拼接在一起,需要将score转换为字符串类型:
score = 0
print("your score is " + str(score))
如果只拼接一个变量还好,但是如果我们有多个不同类型的变量和字符串拼接,就会非常痛苦。
score = 0
height = 1.8
isWinning = True
print("your score is " + str(score))
在Python中有一个非常方便的方法将不同类型的变量插入字符串中。
score = 0
height = 1.8
isWinning = True
print(f"your score is {score}, your height is {height}, your winning is {isWinning}")
7 代码挑战:人生苦短
写一个程序,使用数学运算和F字符串计算到90岁之前你还剩多少天、周、月。
输入你当前的年龄,按照如下格式输出结果:
你还剩 x 天,y 周,和 z 月。
注意:你需要将小数四舍五入。
提示:在这个代码挑战中,假设,1年=365天,1年52周,1年=12月。
样例输入
56
样例输出
你还剩 12410 天,1768 周,和 408 月。
解释
90 - 56 = 34
34 * 365 = 12410
34 * 52 = 1768
34 * 12 = 408
解答
age = int(input("你当前的年龄是多少?"))
rest_year = 90 - age
age_as_day = rest_year * 365
age_as_week = rest_year * 52
age_as_month = rest_year * 12
print(f"你还剩 {age_as_day} 天,{age_as_week} 周,和 {age_as_month} 月。")
8 小费计算器
写一个程序,实现账单计算器,计算根据输入,计算每个人应支付多少钱?
print("欢迎来到小费计算器!")
total_bill = float(input("总账单是多少?"))
percentage_tip = int(input("想要给百分之多少的小费?10,12或者15?"))
people = int(input("多少人分担账单?"))
result = round(total_bill * (1 + percentage_tip / 100) / people, 2)
print(f"每个人应支付:{result}")