学python第二课-语言元素

学python第二课-语言元素

前言


我只是个学python拖了好久的小萌新,一直要学一直要学,刚来注册说到现在,终于开始了。。

也不是特别萌新,会一个小语言(底子好),会一点bat(批处理),python基础知识也了解的不少了,编程逻辑自认为还可以。

这几个月一直在找适合自己的教程,看过几百本电子书,看过无数新老视频教程,最后还是决定用 骆昊大大 的:Python - 100天从新手到大师(zzzain46大大友情推荐)

我会把文章中需要的知识点和内容精简粘贴上来,偶尔给出自己的一些想法(想法用删除线表示)

由于文章是给自己看的,所以肯定会精简掉不需要的东西,想学建议看原教程那里的

大纲是原文大纲,仅供参考,我的文章肯定删减了许多

可能太简单了,勿喷!(主要是给自己看的)

然后软件方面,没有用PyCharm,在用VS Code,还有IDLE

python 版本:3.8.1

操作系统:Windows 10

ps:注释超详细哈哈,没事闲的,里面可能有错误

要牢记的话


感谢:https://github.com/jackfrued/Python-100-Days

  • Make English as your working language. (让英语成为你的工作语言)
  • Practice makes perfect. (熟能生巧)
  • All experience comes from mistakes. (所有的经验都源于你犯过的错误)
  • Don’t be one of the leeches. (不要当伸手党)
  • Either outstanding or out. (要么出众,要么出局)

大纲

Day02 - 语言元素

  • 程序和进制 - 指令和程序 / 冯诺依曼机 / 二进制和十进制 / 八进制和十六进制
  • 变量和类型 - 变量的命名 / 变量的使用 / input函数 / 检查变量类型 / 类型转换
  • 数字和字符串 - 整数 / 浮点数 / 复数 / 字符串 / 字符串基本操作 / 字符编码
  • 运算符 - 数学运算符 / 赋值运算符 / 比较运算符 / 逻辑运算符 / 身份运算符 / 运算符的优先级
  • 应用案例 - 华氏温度转换成摄氏温度 / 输入圆的半径计算周长和面积 / 输入年份判断是否是闰年

语言元素

指令和程序

今天我们大多数时候使用的计算机,虽然它们的元器件做工越来越精密,处理能力越来越强大,但究其本质来说仍然属于“冯·诺依曼结构”的计算机。“冯·诺依曼结构”有两个关键点,一是指出要将存储设备与中央处理器分开,二是提出了将数据以二进制方式编码。二进制是一种“逢二进一”的计数法,跟我们人类使用的“逢十进一”的计数法没有实质性的区别,人类因为有十根手指所以使用了十进制(因为在数数时十根手指用完之后就只能进位了)

对于计算机来说,二进制在物理器件上来说是最容易实现的(高电压表示1,低电压表示0),于是在“冯·诺依曼结构”的计算机都使用了二进制。虽然我们并不需要每个程序员都能够使用二进制的思维方式来工作,但是了解二进制以及它与我们生活中的十进制之间的转换关系,以及二进制与八进制和十六进制的转换关系还是有必要的。如果你对这一点不熟悉,可以自行使用维基百科或者百度百科科普一下。

说明:近期关于量子计算机的研究已经被推倒了风口浪尖,量子计算机基于量子力学进行运算,使用量子瞬移的方式来传递信息。2018年6月,Intel宣布开发出新款量子芯片并通过了在接近绝对零度环境下的测试;2019年,IBM和Google都推出了自己的量子计算机。

变量和类型

在程序设计中,变量是一种存储数据的载体。计算机中的变量是实际存在的数据或者说是存储器中存储数据的一块内存空间,变量的值可以被读取和修改,这是所有计算和控制的基础。计算机能处理的数据有很多种类型,除了数值之外还可以处理文本、图形、音频、视频等各种各样的数据,那么不同的数据就需要定义不同的存储类型。Python中的数据类型很多,而且也允许我们自定义新的数据类型(这一点在后面会讲到),我们先介绍几种常用的数据类型。

  • 整型(Integer):Python中可以处理任意大小的整数(Python 2.x中有intlong两种类型的整数,但这种区分对Python来说意义不大,因此在Python 3.x中整数只有int这一种了),而且支持二进制(如0b100,换算成十进制是4)、八进制(如0o100,换算成十进制是64)、十进制(100)和十六进制(0x100,换算成十进制是256)的表示法。
  • 浮点型(Float):浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,浮点数除了数学写法(如123.456)之外还支持科学计数法(如1.23456e2)。
  • 字符串型(String):字符串是以单引号或双引号括起来的任意文本,比如'hello'"hello",字符串还有原始字符串表示法、字节字符串表示法、Unicode字符串表示法,而且可以书写成多行的形式(用三个单引号或三个双引号开头,三个单引号或三个双引号结尾)。
  • 布尔型(Boolean):布尔值只有TrueFalse两种值,要么是True,要么是False,在Python中,可以直接用TrueFalse表示布尔值(请注意大小写),也可以通过布尔运算计算出来(例如3 < 5会产生布尔值True,而2 == 1会产生布尔值False)。
  • 复数型(不晓得):形如3+5j,跟数学上的复数表示一样,唯一不同的是虚部的i换成了j。实际上,这个类型并不常用,大家了解一下就可以了。

变量命名

对于每个变量我们需要给它取一个名字,就如同我们每个人都有属于自己的响亮的名字一样。在Python中,变量命名需要遵循以下这些必须遵守硬性规则和强烈建议遵守的非硬性规则。

  • 硬性规则:
    • 变量名由字母(广义的Unicode字符,不包括特殊字符)、数字和下划线构成,数字不能开头。
    • 大小写敏感(大写的a和小写的A是两个不同的变量)。
    • 不要跟关键字(有特殊含义的单词,后面会讲到)和系统保留字(如函数、模块等的名字)冲突。
  • PEP 8要求:
    • 用小写字母拼写,多个单词用下划线连接。
    • 受保护的实例属性用单个下划线开头(后面会讲到)。
    • 私有的实例属性用两个下划线开头(后面会讲到)。

当然,作为一个专业的程序员,给变量(事实上应该是所有的标识符)命名时做到见名知意也是非常重要的。(我个人习惯是:First_name,Get_random_number 这样的)

变量的使用

下面通过几个例子来说明变量的类型和变量使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
"""
使用变量保存数据并进行加减乘除运算

版本: 0.2
原作者: 骆昊
修改者:alittlebear
"""

#设置变量
a = 321
b = 12

#输出
print(a + b) # 输出333(和)
print(a - b) # 输出309(差)

print(a * b) # 输出3852(积)
print(a ** b) # 输出1196906950228928915420617322241(a的b次方)

print(a / b) # 输出26.75(商)

print(a // b) # 输出26(商,去掉余数)
print(a % b) # 输出9(余数)

在Python中可以使用type函数对变量的类型进行检查。程序设计中函数的概念跟数学上函数的概念是一致的,数学上的函数相信大家并不陌生,它包括了函数名、自变量和因变量。如果暂时不理解这个概念也不要紧,我们会在后续的章节中专门讲解函数的定义和使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"""
使用type()检查变量的类型

Version: 0.1
Author: 骆昊
"""
a = 100
b = 12.345
c = 1 + 5j
d = 'hello, world'
e = True
print(type(a)) # <class 'int'> 整数
print(type(b)) # <class 'float'> 小数,也就是浮点数
print(type(c)) # <class 'complex'> 看不懂
print(type(d)) # <class 'str'> 字符串
print(type(e)) # <class 'bool'> 布尔值

可以使用Python中内置的函数对变量类型进行转换。

  • int():将一个数值或字符串转换成整数,可以指定进制。
  • float():将一个字符串转换成浮点数。
  • str():将指定的对象转换成字符串形式,可以指定编码。
  • chr():将整数转换成该编码对应的字符串(一个字符)。
  • ord():将字符串(一个字符)转换成对应的编码(整数)。

下面的代码通过键盘输入两个整数来实现对两个整数的算术运算。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
"""
使用input()函数获取键盘输入(字符串)
使用int()函数将输入的字符串转换成整数
使用print()函数输出带占位符的字符串

Version: 0.1
Author: 骆昊
"""
#输入整数a和b,输入小数或者字母就会报错
a = int(input('a = '))
b = int(input('b = '))

#print(a, '+', b, '=', a + b)
print('%d + %d = %d' % (a, b, a + b))

#print(a, '-', b, '=', a - b)
print('%d - %d = %d' % (a, b, a - b))

#print(a, '*', b, '=', a * b)
print('%d * %d = %d' % (a, b, a * b))

#print(a, '/', b, '=', a / b)
print('%d / %d = %f' % (a, b, a / b))

#print(a, '//', b, '=', a // b)
print('%d // %d = %d' % (a, b, a // b))

#print(a, '%', b, '=', a % b)
print('%d %% %d = %d' % (a, b, a % b))

#print(a, '**', b, '=', a ** b)
print('%d ** %d = %d' % (a, b, a ** b))

说明:上面的print函数中输出的字符串使用了占位符语法,其中%d是整数的占位符,%f是小数的占位符,%%表示百分号(因为百分号代表了占位符,所以带占位符的字符串中要表示百分号必须写成%%),字符串之后的%后面跟的变量值会替换掉占位符然后输出到终端中,运行上面的程序,看看程序执行结果就明白啦。

运算符

Python支持多种运算符,下表大致按照优先级从高到低的顺序列出了所有的运算符,运算符的优先级指的是多个运算符同时出现时,先做什么运算然后再做什么运算。除了我们之前已经用过的赋值运算符和算术运算符,我们稍后会陆续讲到其他运算符的使用。

运算符 描述
[] [:] 下标,切片
** 指数
~ + - 按位取反, 正负号
* / % // 乘,除,模,整除
+ - 加,减
>> << 右移,左移
& 按位与
^ ` `
<= < > >= 小于等于,小于,大于,大于等于
== != 等于,不等于
is is not 身份运算符
in not in 成员运算符
not or and 逻辑运算符
= += -= *= /= %= //= **= &= = ^= >>= <<=

说明: 在实际开发中,如果搞不清楚运算符的优先级,可以使用括号来确保运算的执行顺序。

赋值运算符

赋值运算符应该是最为常见的运算符,它的作用是将右边的值赋给左边的变量(也就是将左边的变成右边的)。下面的例子演示了赋值运算符和复合赋值运算符的使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
"""
赋值运算符和复合赋值运算符

Version: 0.1
Author: 骆昊
"""
a = 10
b = 3

#作者把我的备注工作抢走了www
a += b # 相当于:a = a + b
a *= a + 2 # 相当于:a = a * (a + 2)
print(a) # 算一下这里会输出什么

比较运算符和逻辑运算符

比较运算符有的地方也称为关系运算符,包括==!=<><=>=,我相信没有什么好解释的,大家一看就能懂,唯一需要提醒的是比较相等用的是==,请注意这个地方是两个等号,因为=是赋值运算符,我们在上面刚刚讲到过,==才是比较相等的比较运算符。比较运算符会产生布尔值,要么是True要么是False

逻辑运算符有三个,分别是andornotand字面意思是“而且”,所以and运算符会连接两个布尔值,如果两个布尔值都是True,那么运算的结果就是True;左右两边的布尔值有一个是False,最终的运算结果就是False。相信大家已经想到了,如果and左边的布尔值是False,不管右边的布尔值是什么,最终的结果都是False,所以在做运算的时候右边的值会被跳过(短路处理),这也就意味着在and运算符左边为False的情况下,右边的表达式根本不会执行。or字面意思是“或者”,所以or运算符也会连接两个布尔值,如果两个布尔值有任意一个是True,那么最终的结果就是True。当然,or运算符也是有短路功能的,在它左边的布尔值为True的情况下,右边的表达式根本不会执行。not运算符的后面会跟上一个布尔值,它的作用是得到与该布尔值相反的值,也就是说,后面的布尔值如果是True运算结果就是False,而后面的布尔值如果是False则运算结果就是True

~~举个例子:1 and 2 == 2,输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
"""
比较运算符和逻辑运算符的使用

Version: 0.1
Author: 骆昊
"""
flag0 = 1 == 1 # 1的确等于1,所以0为True
flag1 = 3 > 2 # 3的确大于2,所以1为True
flag2 = 2 < 1 # 2不小于1,所以2为False
flag3 = flag1 and flag2 # flag1(True)不等于 flag2(False),所以 flag3等于 False(两者不相同-and ×)
flag4 = flag1 or flag2 # flag1 (true) 不等于 flag2 (False),所以 flag4等于 True(两者不相同-or √)
flag5 = not (1 != 2) # 1 不等于 2 是正确的(True),flag5 不是 正确的(True),那就是错误(False)

print('flag0 =', flag0) # flag0 = True
print('flag1 =', flag1) # flag1 = True
print('flag2 =', flag2) # flag2 = False
print('flag3 =', flag3) # flag3 = False
print('flag4 =', flag4) # flag4 = True
print('flag5 =', flag5) # flag5 = False

说明:比较运算符的优先级高于赋值运算符,所以flag0 = 1 == 1先做1 == 1产生布尔值True,再将这个值赋值给变量flag0print函数可以输出多个值,多个值之间可以用,进行分隔,输出的内容之间默认以空格分开。

练习1:华氏温度转换为摄氏温度。

提示:华氏温度到摄氏温度的转换公式为:$C=(F - 32) \div 1.8$。

个人成品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
"""
第二课-练习1-华氏温度转换为摄氏温度代码

提示:华氏温度到摄氏温度的转换公式为:$C=(F - 32) \div 1.8$。

版本:0.1
作者:alittlebear
"""

Fahrenheit = int(input('华氏度 = '))

Celsius = (Fahrenheit - 32) / 1.8

print('摄氏度 =', Celsius)

参考答案

1
2
3
4
5
6
7
8
9
"""
将华氏温度转换为摄氏温度

Version: 0.1
Author: 骆昊
"""
f = float(input('请输入华氏温度: '))
c = (f - 32) / 1.8
print('%.1f华氏度 = %.1f摄氏度' % (f, c))

我的不足

  1. 只考虑到了整数(华氏度)
  2. 名字太长(长代码来说可能是好的,但是这么点东西,直接f,c就能表示)
  3. 长print用占位符更方便(我偷懒了嘿嘿)

改进后的成品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"""
第二课-练习1-华氏温度转换为摄氏温度代码

提示:华氏温度到摄氏温度的转换公式为:$C=(F - 32) \div 1.8$。

版本:0.1
作者:alittlebear
"""

F = float(input('请输入华氏度:')) #输入一个可以小数可以整数的华氏度

C = (F - 32) / 1.8 #转化为摄氏度

print ('%.1f 华氏度 转化后的 摄氏度 为:%.1f' % (F, C)) #输出

#这里我知道了%f应该是默认6位小数,%.1f是一位,%.2f应该就是两位,以此类推

练习2:输入圆的半径计算计算周长和面积。

个人成品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
"""
第二课-练习2-输入圆的半径计算计算周长和面积代码

基本知识:
Π = 3.1415926 (pi)
r = 半径(Radius)
d = 直径(Diameter)
p = 圆的周长(Perimeter) = 2Πr(Πd)
a = 圆的面积(Area) = Πr²

版本:0.1
作者:alittlebear
"""
pi = 3.1415926

r = float(input('请输入圆的半径:'))

p = 2 * pi * r

a = pi * (r ** 2)

print ('圆的周长 = %.1f;圆的面积 = %.1f' %(p, a))

参考答案

1
2
3
4
5
6
7
8
9
10
11
"""
输入半径计算圆的周长和面积

Version: 0.1
Author: 骆昊
"""
radius = float(input('请输入圆的半径: '))
perimeter = 2 * 3.1416 * radius
area = 3.1416 * radius * radius
print('周长: %.2f' % perimeter)
print('面积: %.2f' % area)

我的不足

  1. 我竟然忘记保留两位小数了。。
  2. 我把变量简写了,不过前面有介绍过,我认为还好。。
  3. 作者直接 r*r,我是 (r ** 2),太复杂了。。

改进后的成品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
"""
第二课-练习2-输入圆的半径计算计算周长和面积代码

基本知识:
pi = 3.1415926 (Π)
r = 半径(Radius)
d = 直径(Diameter)
p = 圆的周长(Perimeter) = 2Πr(Πd)
a = 圆的面积(Area) = Πr²

版本:0.1
作者:alittlebear
"""
r = float(input('请输入圆的半径:'))

p = 2 * 3.1415926 * r

a = 3.1415926 * r * r

print ('圆的周长 = %.2f;圆的面积 = %.2f' %(p, a))

练习3:输入年份判断是不是闰年。

个人成品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
"""
第二课-练习3-输入年份判断是不是闰年代码

版本:0.1
作者:alittlebear
"""
year = int(input('请输入要判断的年份:'))

#方法1,直接通过取模判断
num1 = year % 4

if num1 == 0 :
print ('%d 是闰年' % (year))
else :
print ('%d 不是闰年' % (year))


#方法2,通过取模后与0的布尔值判断
num1 = year % 4 == 0

if num1 == True :
print ('%d 是闰年' % (year))
else :
print ('%d 不是闰年' % (year))

参考答案

1
2
3
4
5
6
7
8
9
10
11
"""
输入年份 如果是闰年输出True 否则输出False

Version: 0.1
Author: 骆昊
"""
year = int(input('请输入年份: '))
# 如果代码太长写成一行不便于阅读 可以使用\对代码进行折行
is_leap = year % 4 == 0 and year % 100 != 0 or \
year % 400 == 0
print(is_leap)

说明:比较运算符会产生布尔值,而逻辑运算符andor会对这些布尔值进行组合,最终也是得到一个布尔值,闰年输出True,平年输出False

我的不足

  1. 我超纲了!!用了 if 和 else 哈哈。。(管他呢)
  2. 忘记四年一闰,百年不润,四百年又闰(噗,只想到了4年)

改进后的成品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
"""
第二课-练习3-输入年份判断是不是闰年代码

版本:0.1
作者:alittlebear
"""
year = int(input('请输入要判断的年份:'))

#通过取模后与0的布尔值判断
num1 = year % 4 == 0 and year % 100 != 0 or year % 400 == 0

if num1 == True :
print ('%d 是闰年' % (year))
else :
print ('%d 不是闰年' % (year))

总结

  1. 了解了电脑的基本是二进制(虽然这些早就知道了)
  2. 了解了变量的数据类型(整数,浮点数也就是小数,字符串,布尔,还有一个复数型)
  3. 了解了变量的命名规则
  4. 知道了如何进行简单的变量数学运算
  5. 知道了如何查看(和更改)变量的数据类型
  6. 知道了占位符%d, %f, 还有%%(转义,表示%)
  7. 知道了 =,+=,*=,==,<= 等的区别
  8. 知道了布尔值(Boolean),还有and,or,not 判断

补充一位大佬指点我的:

补充一个
Python允许同时为多个变量赋值。例如:
a = b = c = 1
也可以为多个对象指定多个变量。例如:
a, b, c = 1, 2, “abc”
多个对象赋值不同数据类型变量好像是很多语言不支持的,python这个用起来很方便

所有用到的链接

疑问

(删除的已解决)

  1. 复数型变量目前不知道是干啥用的
评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...