输入输出
和用户交互
我们把用户将信息传递给程序的过程叫做输入
把程序将结果展示给用户的过程称为输出
输入输出的最基本方法就是控制台。用户通过控制台输入一些字符串,程序再通过控制台打印出一些字符串
那么什么是控制台呢?
对于机械的操作面板,我们叫做控制台,控制台上会有一些按钮,开关,操作杆等等
后来有了计算机之后,控制台的概念也延续下来了
只不过计算机是通过键盘鼠标等进行操作,把操作结果显示到屏幕上
因此,在计算机里,把用户能输入命令,向计算机安排工作,计算机再把结果显示出来的程序,就叫做控制台
pycharm中,下面的那个窗口,就属于控制台,像这样一些通过命令来与用户交互的东西,就叫做控制台
控制台是一种人和计算机交互的最基础方式,但是日常生活中并不常用,因为控制台都是用命令来操作交互的。
日常生活中,更多地是使用图形化界面来交互,通过点击图形等等,来进行交互,可以降低用户的使用门槛。
虽然图形化交互简单,但是图形化界面的程序边写起来并不容易!
基于控制台输出
使用print函数将想输出的输出到控制台
print(a)
print("hello world")
a = 10
print(a)
格式化字符串
如果我们要把数字和字符串混在一起打印,有好几种写法,这就是其中一种,这个语法叫做格式化字符串
f-string
此处的f表示"format"
当我们给这个字符串前面加上一个f前缀的时候,就意味着我们可以通过大括号的方式,往字符串里嵌入变量或表达式
大括号里是表达式或变量都可以
Python中还支持其他的格式化字符串的方法,暂时不做介绍
不是Python设计哲学是简单为主吗,为什么格式化字符串要有好几种解决方案呢?
这是因为Python在发展中,像格式化打印字符串,很多编程语言都进行了各自的探索,比如说C语言,采用了printf,%d%s这样的占位符。C++采用了cout<<,Java采用了字符串拼接,允许字符串和其他类型的值进行拼接。但是这些存在一些问题的
比如C语言这种,一旦%d这些类型不匹配,就会出问题
C++这种整体打印格式非常不直观,可读性很差
Java这里面缺少了一些必要的校验功能。
Python最早支持的格式化字符串是效仿C的printf,并做出了改进,一直到Python3.6版本才开始支持f-string
通过控制台输入
Python使用input函数从控制台读取用户的输入
num = 0
num = input("请输入一个整数")
print(f"你输入的整数是 {num}")
input执行的时候,就会等待用户输入。这个等待可能是一个非常长的等待,完全看用户什么时候输入。用户始终不输入,就会一直等(不见不散)
input返回的值其实是一个字符串,如果只是单纯的拿到用户的输入,然后打印,此时按照str打印即可。如果需要根据用户输入的内容进行算数计算,此时就需要先把读到的字符串转成int,我们可以使用int()进行类型的转换
由此可见,类型在动态变化
如果我们不用类型转换,编译器只会是把字符串相拼接
所以当我们想在字符串中将变量计算时,要这样写
那么如果想把整数转换成字符串呢?str()
想把字符串转成浮点数呢?float()
我们在要实现一个目的之前,要注意自己当前的类型是否符合要求
运算符
运算符分为:算术运算符、关系运算符、逻辑运算符、赋值运算符
算术运算符
像+、-、*、/、**、//、这种进行算数运算的运算符,就做算术运算符
先算乘方、乘除后算加减,如果运算过程中想修改默认的运算顺序,就需要加上括号
除法的第一个问题
在Python中,0不能作为除数
print(15 / 0)
像这种运行时出现的错误,也叫作抛出异常,不同异常会有自己的名字。
如果程序运行过程中抛出异常,后面的代码就会直接中止,不会执行
当计算机遇到不合理的地方,就是直接躺地上摆烂
即使是0.0也不行,有些编程语言中,除整数0会抛出异常,但是除浮点0会得到无穷大,而Python不论除哪种形式的0,都会认为是除0异常
除法的第二个问题
阶段的问题,整数除整数,如果除不尽,得到的是一个小数,不会出现截断的情况
除Python外,大部分编程语言都是截断的
关于%求余数
print(7 % 3)
乘方运算
既能够支持整数次方,又能够支持小数次方(开方运算例如2的0.5次方,就是开方)
//地板除法
地板除法(取整除法),会针对计算的结果进行“向下取整”
例如:print(7 // 2)
得到的结果是3
print(-7 // 2)
得到的结果是-4
关系运算符
关系运算符就是在比较两个操作数之间的“大小”“相等”
<、>、>=、<=、==、!=
1.关系运算符对应的表达式,值是布尔型。表达式符合要求,为真,不符合要求为假
2.关系运算不光可以针对数字进行比较,还能够比较字符串
字符串的比较规则是什么呢?
我们可用三个字概括:字典序
在英文词典上,单词是按照一定的顺序来排列的
先看首字母在字母表上的顺序,谁小谁就排在前面,如果首字母相同,依次比较第二个字母,第三个字母.......
那么如果是中文呢?
针对中文进行字符串大小比较,是没有意义的,至少按照默认的字典序来说,它是没有意义的。在计算机里,表示中文,其实是用多个字节构成的一个比较大的数字来进行比较的。当然中文也不是完全不能比较,比如手机通讯录,这个是使用了第三方库才实现的类似的规则
在C/Java/C++中,字符串之间不能直接使用==、!=来比较
在C语言中,使用strcmp比较,如果直接使用==是来比较两个字符串首元素地址
Java是使用equals方法,如果直接使用==本质上在比较这两个字符串是否是同一个对象
上述两个是一个小众的行为,像Python一样直接使用==和!=来比较字符串内容相同,是大部分编程语言遵守的规则
3.针对浮点数来说,使用==比较相等,存在一定的风险
因为浮点数在内存中的存储和表示,是可能存在误差的。这样的误差在进行算术运算的时候就可能被放大,从而导致==的判定出现误判
虽然0.3与计算出的值已经非常接近了,但是如果直接使用==进行比较,仍然会出现False的情况
正确的比较浮点数相等:作差,看差值是否小于预期的误差范围
注意:Python中支持这种连续小于的写法,判定a - b既是< 0.000001又是> -0.000001
逻辑运算符
and并且。两侧均为真,则为真,否则为假(一假则假)
or或者。两侧有一个是真,就是真(一真则真)
not逻辑取反。只有一个操作数,操作数为True,则返回False,为False则返回True
在C++或Java中,使用&&表示逻辑与,并且。||表示逻辑或,或者。|表示逻辑非,逻辑取反
相比较来看,Python的更加直观
逻辑运算符中的重要细节:短路求值
对于and表达式来说,如果左侧表达式为False,那么整体一定是假,右边的表达式就不计算了
对于or操作来说,如果左侧表达式为True,那么整体的值一定为真,右侧表达式就不计算了
大部分语言都存在这样的短路
赋值运算符
=表示赋值,意思就是把右侧的值填充到左侧的空间中,这个空间得是一个变量才行。10 = 20是不行的
==表示的是比较相等,是算数运算符
可以连续赋值
a = b = 20先把20赋值给b,再把b赋值给a,这种操作叫做链式复制,虽然合法,但是一般不建议这么用,建议一行代码只包含一个操作
还有一种赋值方式:a, b = 10, 20
表示把10赋给了a,把20赋给了b,这种赋值方式叫做多元赋值,能够帮我们解决一些特殊问题:两个变量的交换
复合赋值运算符
+=、-=、*=、/=、%=
在使用复合赋值运算时,必须要先定义,否则会抛异常。因为a += 1是先读取a,再运算
a += 1
print(a)
错,因为要先定义
注意:Python中是不支持++,--这样的自增自减操作的,之所以++a不报错,是因为Python编译器把+当成了正号,--a也不会报错,是把减号当成了负号,最终的值仍然不变,但是后置++和后置--都是语法报错的。
那么为什么不支持呢?因为Python的设计哲学,+=,-+已经很方便了,没必要再设置了。而且前置++和后置++这些的对于初学者来说是非常不友好的。为了没有这些困扰,Python就把删了
前置++和后置++是C语言开的头,Go语言也觉得这样不好,所以废除了前置++,只保留了后置++,而且这个后置++不能取表达式的返回值
其他运算符
除了上述的运算符外,还有一些运算符,比如:身份运算符,判断两个对象是不是相同身份(is, is not),成员运算符判断某个元素是不是被另外一个元素包含(in, not in),位运算符(&,|,~,^, <<, >>)等