day2
君埋泉下泥销骨,我寄人间雪满头。
语言漫话
寻根溯源
冯·诺依曼结构
如今大多数的计算机硬件系统仍然是基于冯·诺依曼结构建立的。
冯·诺伊曼结构主要有两个方面
- 存储设备与中央处理器分开
- 数据以二进制方式编码
因此,计算机的硬件系统通常由五大部件构成,包括:运算器,控制器,存储器,输入设备和输出设备。其中,运算器和控制器放在一起就是我们通常所说的中央处理器,它的功能是执行各种运算和控制指令以及处理计算机软件中的数据。我们所说的程序就是指令的集合,程序就是将一系列的指令按照某种方式组合到一起,然后通过这些指令去控制计算机来做我们想让他做的事情。
变量和类型
变量本质上就是计算机的一块内存空间,一般具有读写操作。计算机处理的数据有许多种,除了数值之外,还包括文本,图形,音频,视频等多种数据。python中的数据类型有许多种,与其他语言一样,用户也可以自定义新的数据类型。接下里,先介绍几个新伙伴。
- 整型:python中可以处理任意大小的整数,(python2中有
int
和long
两种类型的整数区分,但这种区分在python3中就消失了,最后整数就只剩下了int
老大哥留下来了,因此以后写大整数加减乘除的时候,知道用什么了吧),在python中二进制,八进制,十进制,十六进制表示的方法如下(这里统一表示16)
进制 | 表示方法 |
---|---|
二进制 | 以0b 开头,0b10000 |
八进制 | 以0o 开头,0o20 |
十进制 | 直接写就可以了,16 |
十六进制 | 以0x 开头,0x10 |
- 浮点型:浮点数就是小数,与定点数相对,定点数就是小数点是固定的,浮点数就是小数点是不固定,因为浮点数的表示方式采用的是科学计数法,因此小数点的位置是可以变化的。
a = 1.234 # 定点数
b = 12e34 # 浮点数
- 字符串型:字符串是以单引号or双引号or三引号括起来的任意文本,比如
'abc'
,"abc"
,'''abc'''
,"""abc"""
,当然还包括原始字符串r'/n'
(这时候输出的不是换行,而是原先的文本内容/n,也就是说会输出原本的内容,而不是转义过后的内容),字节字符串,Unicode字符串有兴趣的可以自行了解。注意这之中只有三引号是支持多行形式,其他不行的。 - 布尔型:python中只有
True
和False
两种值。注意这边的大小写,python是对大小写敏感的语言。当然也可以通过返回值为布尔值的表达式来进行赋值,比如1 < 2
或者1 == 2
等。 - 复数型:
1 + 1j
,这种形式就是复数的表示方式,注意这边的虚数单位使用j而不是用i,其他的表达方式与以前学过的数学知识匹配。
变量命名
你的名字是我读过最短的情诗
变量的命名遵循以下硬性规则(给解释器大哥一个面子):
- 变量名由字母(广义的Unicode字符,不包括特殊字符)、数字和下划线组成,数字不能开头
- 大小写敏感(大写的A和小写的a是不一样的变量)
- 不要跟关键字(有特殊含义的单词)和系统保留字(如函数、模块等的名字)冲突
人为要求如下(可以不遵守,只是建议)
- 用小写字母拼写,多个单词用下划线连接
- 受保护的实例属性用单个下划线开头
- 私有的实例属性用两个下划线开头
当然如今合作编程独占鳌头,所以变量命名做到见名知意也是非常重要的。
变量的使用
python和别的语言不一样,不需要再为记不住变量类型而烦恼了,其自动匹配变量类型。也就是变量的定义加声明直接a = 123
就是定义了一个整型变量a,前面不用加int。所以,如果a = 1, b = 2, a/b
在python中输出的结果是0.5可不是像C中的0。
a = 321
b = 123
print(a + b)
print(a - b)
print(a * b)
print(a / b)
在python中可以使用type
函数对变量的类型进行检查。这里的函数概念是通用的,笔者这里不表。
a = 100
b = 12.345
c = 1 + 5j
d = 'hello, world'
e = True
print(type(a))
print(type(b))
print(type(c))
print(type(d))
print(type(e))
"""
output:
<class 'int'>
<class 'float'>
<class 'complex'>
<class 'str'>
<class 'bool'>
"""
进行类型转换,可以使用python中内置的函数对变量类型进行转换。注意由于python中的变量类型不是我们定义的,所以如果是
a = 123
b = 12.3
a = b
这里可不会像C中进行强制类型转换,而是直接将a也变成12.3,所以python中的类型转换推荐使用python自带的类型转换函数,否则容易出现一些奇怪的错误。
函数 | 作用 |
---|---|
int() |
将一个数值或字符串转换成整数,可以指定进制(这里多是字符串指定什么进制转换成十进制) |
float() |
将一个字符串转换成浮点数 |
str() |
将指定的对象转换成字符串形式,可以指定编码 |
chr() |
将整数转换成该编码对应的字符串(一个字符) |
ord() |
将字符串(一个字符)转换成对应的编码(整数) |
bool() |
转换成布尔类型 |
complex() |
转换成复数类型 |
填鸭来了:input()
表示从键盘读取数据,括号中可以填入字符串,表示输出到输出设备上,作为提示
a = int(input('a = '))
b = int(input('b = '))
print('%d + %d = %d' % (a, b, a+b))
print('%d - %d = %d' % (a, b, a-b))
print('%d * %d = %d' % (a, b, a*b))
print('%d / %d = %f' % (a, b, a/b))
print('%d // %d = %d' % (a, b, a//b))
print('%d %% %d = %d' % (a, b, a%b))
print('%d ** %d = %d' % (a, b, a**b))
注意:看到input()
就会了解到python对于字符串的优待了。其首先是将键盘上输入的信息转化为字符串形式存储,如果没有类型转换,那么默认就是str类型,所以使用input一般要配套使用前面的类型转换函数。这边前面的是占位符,和C/C++的类似,这里不再赘述。注意python中的格式化输出语句的格式,是通过%
来分割的,不是,
,逗号是用来分割语句的,而所需要占位的数据都是写在小括号中,通过逗号分离。
ps:这里的//
是python中将整除和除法分离出来的产物,//
代表整除,/
代表正常的除法,**
表示幂运算。
运算符
老生常谈的大魔王级别的运算符优先级表格(这年头能不能用括号区分优先级了)
运算符 | 描述 |
---|---|
[] ,[:] |
下标,切片 |
** |
指数 |
~ ,+ ,- |
按位取反,正负号 |
* ,/ ,% ,// |
乘,除,模,整除 |
+ ,- |
加,减 |
>> ,<< |
右移,左移 |
& |
按位与 |
^ ,| |
按位异或,按位或 |
<= ,< ,> ,>= |
小于等于,小于,大于,大于等于 |
== ,!= |
等于,不等于 |
is ,is not |
身份运算符 |
in ,not in |
成员运算符 |
not ,or ,and |
逻辑运算符 |
= ,+= ,-= ,*= ,/= ,%= ,//= ,**= ,&= ,|= ,^= ,>>= ,<<= |
各种赋值运算符 |
建议用括号来保证运算的执行顺序
赋值运算符
就是将右边的值赋值给左边,也是区分=
和==
的开始
a = 10
b = 3
a += b
a *= a + 2
print(a)
a *= a + 2
因为+
的优先级高于*=
,没办法,赋值运算符的优先级是最低的,最卑微的。因此该语句实际上等价于a = a * (a + 2)
比较运算符和逻辑运算符
比较运算符所组成的表达式的值是布尔类型的,包括==
,!=
,<
,<=
,>
,>=
,注意这边判断是否相等不是数学上的=
,而是==
。
逻辑运算符有三个,and
,or
和not
。
and
就是与运算,只有左右两边的布尔值都是True的时候表达式才会返回True,否则返回False。如果and
左边的布尔值是False的时候,那么无论右边是什么值,其最终的结果都是False,因此在做运算的时候右边的值会被跳过(短路处理),即and
左边的值为False的时候,右边的表达式根本不会执行,这点和C/C++非常相似。or
就是或运算,只有左右两边的布尔值都是False的时候,最终的结果才会是False,否则都为True。or
一样也有短路运算,只要左边的布尔值是True,那么右边的表达式一样也根本不会执行。not
就是非运算。其只在后面添加一个布尔值,也就是单目运算符,作用就是返回和后面的布尔值相反的布尔值,比如后面是True,返回就是False。
a = 1==1
b = 3 > 2
c = 2 < 1
d = a and c
e = a or c
f = not(1 != 2)
print(a)
print(b)
print(c)
print(d)
print(e)
print(f)
'''
output:
True
True
False
False
True
False
'''
课后练习
- 这里
%.1f
和C/C++中的占位符的含义一样,也是输出小数,保留小数点后一位 - 关于
print(f'{f:.1f}')
输出的解释:在字符串之前添加f表示格式化字符串,也就是此时我们原来的占位符此时可以替换成大括号,大括号包围的区域就是所需要替换的区域。 - 跨行写代码可以借助
()
也可以借助’/’,但是对于//
一定要是有一个运算符在前面否则会报错或者得到错误答案,因为此时系统不认为你在跨行写表达式
关于str类型的补充
函数 | 功能 |
---|---|
len() |
获取字符串的长度,len(str) |
title() |
将字符串中每个单词的首字母变成大写,str.title() |
upper() |
将字符串中的字母全部变成大写,str.upper() |
lower() |
将字符串中的字母全部变成小写,str.lower() |
startwith(str1) |
字符串是不是以str1开头的,str.startwith(str1) |
endwith(str1) |
字符串是不是以str1结尾的,str.endwith(str1) |
这里字符串和字符串可以直接进行拼接,即str1 + str2
就可以了,如果str * int
,那么就是str重复int遍
原创文章,作者:端木书台,如若转载,请注明出处:https://blog.ytso.com/276540.html