Python学习记录1

# Python学习记录1

@TOC


前言

记录在自学过程中对Python的记录,与 或 非 在Python中的应用;Python中的循环与分支;BIF及一些基础知识.

提示:以下是本篇文章正文内容,下面案例可供参考

一、or and not

and or not 都是一些逻辑操作符.在之前c语言的学习过程中遇到了很多次,只有当and操作符左右两边的操作符同时为True的时候 输出的结果才为True.
例如:

1
2
3
4
>>>5 > 4 and  4 < 1
False
>>>5 > 4 and 4 < 7
True

or 操作符和and不同,简单来说只要任意一边为真,结果就为真。 只有当两边同时为假时,才为假。

1
2
3
4
>>>77 > 55 or 5 > 999
True
>>>111 < 2 or 7 > 99
False

not操作符就很简单了,它是一个一元操作符,作用是得到一个和操作数相反的布尔类型的值。

1
2
3
4
>>>not True
not
>>>not 0
True

补充:布尔类型对象可以被赋予文字值true或者false,所对应的关系就是真与假的概念。
布尔类型( bool)
布尔类型只有两个值,false 和 true。
通常用来判断条件是否成立。
如果变量值为 0 就是 false,否则为 true,布尔变量只有这两个值。
如:
  例1:bool pb= -1.5; // pb=true;
  例2:bool pt=0; // pt=false;
例3:不同的关系运算符中的布尔类型值的结果
在这里插入图片描述

另外在书上看的一个比较有趣的思考题:(not 1) or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9)的结果应该是多少?
个人理解:在这个例子中首先是逻辑判断的优先级问题,not > and > or
然后是and 的短路逻辑。因为在and 中,两个为Ture才是真正的Ture .在 0 and 1 中 ,如果第一个值是0 也就是False ,系统会认为反正第二个值不管是什么都会返回一个 0 (False),在 3 and 4 中 ,第一个值是 3 也就是Ture,系统就会继续向下读值,也就会返回 4 了。然后是or 的短路逻辑。因为在or中,一个为Ture就是Ture了。
在(0) or (0) or (4) or (6) or (9)中,首先遇到 0 ,0 是False ,接下来的值有可能是Ture,所以会继续向下读,当遇到 4 的时候,为Ture,系统就会停止判断,直接将为Ture的值返回。

1
2
3
4
>>> (not 1) or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9)
4
>>> (0) or (0) or (4) or (6) or (9)
4

也可以这么理解:
if a and b:#如果a是false,那么跳过b的判断,结果直接false
if a or b:#如果a为true,那么跳过b的判断,直接true

or中至少有一个非0时,返回第一个非0数。
and中含0就返回0,若是均非0,则返回后面的值。

二、缩进

缩进可以说是Python的灵魂,因为缩进的严格要求才使得Python的代码显得非常精简,这也正是我想要学好Python的原因。但是在Python里对待代码的缩进要十分小心,因为如果没有正确地使用缩进,代码所做的事可能和我们的本意相差很大。

如果在正确的位置输入冒号(:),IDLE会在下一行自动进行缩进。在if和else语句后边加上冒号(:),然后回车,第二行代码会自动进行缩进。if条件下面有两个语句都带有一个缩进,说明这两个语句是属于if条件成立后所执行的语句。也可以认为如果if条件不成立,那么两个缩进的语句都不会执行。
if-else是一个条件分支,if后边跟的是条件,如果条件成立,就执行以下缩进的所有内容,如果条件不成立,有else的话就执行else下缩进的所有内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
score = int(input('请输入一个分数:  '))


if 100 >=score>= 90:
print('A')
else:
if 90 >=score>= 80:
print('B')
else:
if 80 >=score>= 60:
print('C')
else:
if 60 >=score>= 0:
print('D')
else:
print('输入错误')

三、BIF

BIF就是(built-in functions)内置函数
目的:为了方便程序员快速的编写程序
dir(builtins)
print(dir(builtins))

在这里插入图片描述
其中help()这个BIF用于显示BIF的功能描述:在这里插入图片描述

四、分支与循环

分支的概念:分支也就是在习惯使用的if条件判断,在条件持续保持成立或不成立的情况下,都执行固定的流程。
一旦条件发生改变,原来成立的条件就变为不成立,那么程序就走入另一条路了。

对于循环的概念我觉得可以这么理解 贪吃蛇大家都玩过 在你的蛇还没死的时候会不断的产生新的果子,只要你的蛇还没死 那么这个果子就会一直生成,也就是说只要不触发死亡机制,游戏就会一直在一个循环中执行。
可能分支就是只有符合条件,才会就执行命令。
而循环是只要符合条件,就会一直执行这个命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
score = int(input('请输入一个分数:  '))


if 100 >=score>= 90:
print('A')
if 90 >=score>= 80:
print('B')
if 80 >=score>= 60:
print('C')
if 60 >=score>= 0:
print('D')
if score< 0 or score> 100:
print('输入错误')

上面对于成绩的分类划分其实就是一种分支和循环
但是这个并没有使用else

1
2
3
4
5
6
7
8
9
10
11
12
13
score = int(input('请输入一个分数:  '))


if 100 >=score>= 90:
print('A')
elif 90 >=score>= 80:
print('B')
elif 80 >=score>= 60:
print('C')
elif 60 >=score>= 0:
print('D')
else:
print('输入错误')

这是经过改良的代码 我们可以分析一下第一个代码,当我们输入成绩99分的时候,第一次判断即成立,接着会打印A,虽然已经有了答案,但是程序还不能立刻结束,还需要对后面的四个条件进行判断,知道后面的所有条件都不符合,才会结束程序。
然而在改良后的代码中,同样是输入99分的时候,第一次判断成立就可以退出程序并打印A。
这仅仅是一个很简单的代码 所以我们感觉差别不大,但可以试想一下 如果这是一个很大的程序 那么每判断一次就会消耗一个CPU时间,可想而知这其中的差距。

最近在看书的时候遇到一个避免“悬挂else”的问题学习之后觉得挺有用的 分享一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main (void)
{
int age =20;
char score=‘A’;


if (age<18)
if (score =='A')
printf("恭喜,一等奖。");
else
printf("很抱歉,本活动只限于18岁以下青少年参与");
return 0;
}

其实这个作者的本意是 :如果age不满足条件(age<18),就执行else的内容。但是实际上程序并不会按照我们想的来执行,程序反而是会直接打印“恭喜,一等奖。”这个字符串。那与我们的本意差太多了

会这样的原因是因为对于很多语言来说if-else语法都会采用“就近匹配”的原则(可以直接记住就近原则哈哈哈)
所以上面代码的else应该是属于内存的if语句。

1
2
3
4
5
6
7
8
9
10
age=20
score ='A'


if age<18:
if score =='A':
print("恭喜,一等奖.")

else:
print("很抱歉,本活动只限于18岁以下青少年参与")

前面提到过缩进是Python的灵魂,也就是说因为缩进的严格使得Python代码显得精简,也可以认为就是让我们十分确定else是属于哪一个if,不存在c语言中模棱两可的情况。

可能这就是Python的魅力吧

五、while for 语句

1.
while循环与if条件分支类似,区别就在 只要条件为真,while循环就会一直重复执行那一段代码,这段代码称为循环体。
我们就用1+2+3+….+100的计算结果:

1
2
3
4
5
6
7
i =1
sum =0

while i<=100:
sum+=i
i+=1
print(sum)

我们每次在设计循环体的时候都要考虑退出循环的条件,上面的代码中 每执行一次循环体的代码,变量i的值就会+1,这样的i会不断递增,知道i等于101的时候,条件不再成立,从而退出循环。
这里再补充一点别的知识
a+=1 ⇔每次在a的本身上+1
a=+1⇔是给a赋值 +1
我手快当时打错 发现的小问题

接着上面的循环体来讲,如果缺少i+=1语句,循环将永远不会退出(除非你强制关掉)这也就是死循环。
2.
for循环语句的语法如下:
for 变量 in 可迭代对象:
循环体
可迭代对象也就是指那些元素可以被单独提取出来的对象,如“Clearlove”(我最喜欢的选手啊啊哈哈)那么for循环语句每执行一次就会从这个字符串(可迭代对象)中拿出一个字符,然后存放到变量中。

1
2
3
4
5
6
7
8
9
10
11
12
for each in "Clearlove"

print(each)
C
l
e
a
r
l
o
v
e

但是如果想要用for循环来实现1+2+3+..+100的计算结果可不能像我下面这么写

1
2
3
4
sum=0
for i in 100:
sum +=1
print(sum)

这样是不可能正确的(因为我错了)
原因就在于100这是个整数 而不是可迭代对象

如果非得用for语句 也不是不行
需要我们认识一个range()
这是一个BIF函数,它的功能是为指定的整数生成一个数字序列可迭代对象),语法如下:
range(stop)
range(start,stop)
range (start,stop,step)
range有三种用法,无论哪一种 参数必须是整数。

第一种用法是只有一个参数的情况,它会生成从0到该参数的数字序列:

1
2
listrange7))
0123456

list是将可迭代对象以列表的形式展示出来。
第二种用法除了指定了结束数值,还指定了开始数值

1
2
listrange(5,10))
56789

第三种用法是还可以指定步长,这个值默认为1,即生成的数字序列中,每个元素的间隔为1.

1
2
list(range(0,10,2))
(0,2,4,6,8

其实这个步长也可以是负整数

1
2
list(range(0,-10,-2))
(0,-2,-4,-6,-8)

值得我们注意的是,生成的数字序列中,只包含了开始数值,并不包含结束数值。
介绍完了range的用法 那么我们刚才的问题可以解决了

1
2
3
4
sum =0
for i in range(101):
sum +=i
print(sum)

range 可以说是for的好基友,在for语句中给了很大的帮助

总结

对于python的学习自己还只是刚刚开始,python之路任重而道远。

Prev:
Python学习记录2
Next:
CTF+密码学
catalog
catalog