python学习之可变不可变&运算符&if

昨日回顾

问题一、变量在栈区和堆区中是怎么存放的

x = 10

当python执行上面的代码时,会发生以下事情:

在内存的堆区中,会开辟一个内存空间,里面存放着变量值10;

而在栈区中,会产生一个映射关系,将变量名x与10的内存地址0x0001关联起来;

变量在堆区和栈区的存放方式如下:

变量名与变量值的内存地址的映射关系存放于栈区;(可以简单理解为变量名存着值的内存地址)

变量值存放于堆区;(内存管理回收的是堆区中的内容)

拓展延伸:python中变量名的赋值(x=y)和函数的传参(print(x)),传递的都是栈区的数据,而栈区中存放的都是变量名和变量值的内存地址的映射关系,或者说叫变量名对值的引用,因此python中参数的传递都是引用传递。

问题二、什么是直接引用和间接引用?

直接引用:指的是从栈区出发,到堆区中能够直接引用到的内存地址

间接引用:指的是从栈区出发,引用到堆区之后,需要进一步引用才能引用到的内存地址

1、可变类型和不可变类型

可变类型:值改变,id不改变,说明原值是可以修改的,证明原值是可以改变的;

列表、字典 是可变类型

不可变类型:值改变,id改变,说明是产生了新的值,原值根本就没有改变,证明原值是不可以被修改的;数字、字符串、元组、布尔值是不可变类型

1.1不可变类型

1.1.1 数字是不可变类型

#****此例忽略小整数池的影响
x = 10
print(id(x))    #8791308814272
x = 20
print(id(x))    #8791308814592

y = 10.3
print(id(y))    #31414384
y = 11.3
print(id(y))    #5334000

对于int和float型数据,值改变,id也改变,证明数字是不可变类型。

1.1.2 字符串是不可变类型

str_1 = 'abc'
print(id(str_1))    #31172400
str_1 = 'def'
print(id(str_1))    #31254512

值改变,id也改变,证明字符串是不可变类型。

小结:

在python中,数字(int和float)、字符串、布尔被设计成成不可分割的整体,不能被改变。

1.2可变类型

1.2.1列表是可变类型

list01 = [11,22,33,44,55,66]
print(id(list01))               #4842816
list01[2] = 88
print(id(list01))               #4842816

列表的值修改了,但是id没有变,证明列表是可变类型。

1.2.2字典是可变类型

dic01 = {'name':'egon','age':18}
print(dic01)                        #{'name': 'egon', 'age': 18}
print(id(dic01))                    #38883712
dic01.pop('age')
print(dic01)                        #{'name': 'egon'}
print(id(dic01))                    #38883712

字典的值修改了,但是id没有变,证明字典是可变类型。

小结:

在python中,列表、字典属于容器类型,是可以被改变的。

2、条件

什么是条件?条件是在进行判断的依据;

为什么要有条件?是为了让计算机能够像人一样在某种情况下,去干某件事情。

条件可以是:比较运算符

age = 18
print(age > 16)  # 条件判断之后会得到一个布尔值

条件可以是:True、False

is_beautiful=True
print(is_beautiful)

隐式布尔值,所有的值都可以当成条件去用

其中0、None、空(空字符串、空列表、空字典)=》代表的布尔值为False,其余都为真

3、逻辑运算符

3.1 not、and、or的基本使用

not:就是把紧跟其后的那个条件结果取反

把not与紧跟其后的那个条件是一个不可分割的整体

print(not 16 > 13)
print(not True)
print(not False)
print(not 10)
print(not 0)
print(not None)
print(not '')

and:逻辑与,and用来链接左右两个条件,两个条件同时为True,最终结果才为真

print(True and 10 > 3)

print(True and 10 > 3 and 10 and 0) # 条件全为真,最终结果才为True
print( 10 > 3 and 10 and 0 and 1 > 3 and 4 == 4 and 3 != 3)  # 偷懒原则

or:逻辑或,or用来链接左右两个条件,两个条件但凡有一个为True,最终结果就为True,

​ 两个条件都为False的情况下,最终结果才为False

print(3 > 2 or 0)
print(3 > 4 or False or 3 != 2 or 3 > 2 or True) # 偷懒原则

3.2 优先级not>and>or

如果单独就只是一串and链接,或者说单独就只是一串or链接,按照从左到右的顺讯依次运算即可(偷懒原则)。

如果是混用,则需要考虑优先级了。

res=3>4 and not 4>3 or 1==3 and 'x' == 'x' or 3 >3
print(res)

res=(3>4 and (not 4>3)) or (1==3 and 'x' == 'x') or 3 >3
print(res)

res=3>4 and ((not 4>3) or 1==3) and ('x' == 'x' or 3 >3)
print(res)

4、成员与身份运算符

4.1 成员运算符

print("egon" in "hello egon") # 判断一个字符串是否存在于一个大字符串中
print("e" in "hello egon") # 判断一个字符串是否存在于一个大字符串中
print(111 in [111,222,33]) # 判断元素是否存在于列表

判断key是否存在于字典

print(111 in {"k1":111,'k2':222})
print("k1" in {"k1":111,'k2':222})

not in

print("egon" not in "hello egon") # 推荐使用
print(not "egon" in "hello egon") # 逻辑同上,但语义不明确,不推荐

4.2 身份运算符

is # 判断的是id是否相等

5、流程控制之if判断

代码块:

1.代码块指的是同一级别的代码,python中用缩进相同的空格数来标识同一级的代码块。

2.同一级别的代码块会按照自上而下的顺序运行。

语法一:

if 条件:#条件成立的情况下会执行的代码块

  子代码1

  子代码2

  子代码3

​ ............

语法二:

if 条件:#条件成立的情况下会执行的代码块

  子代码1

  子代码2

  子代码3

else:#条件不成立的情况下会执行else包含的代码块

  子代码1

  子代码2

  子代码3

语法三:

if 条件1:#条件1成立的情况下会执行的代码块

  子代码1

  子代码2

  子代码3

elif条件2:#条件2成立的情况下会执行的代码块

  子代码1

  子代码2

  子代码3

elif 条件3:#条件3成立的情况下会执行的代码块

  子代码1

  子代码2

  子代码3

else:#上述条件都不成立的情况下会执行的代码块

  子代码1

  子代码2

  子代码3

score = input('请输入您的成绩:') # score="18"
score=int(score)
if score >= 90:
    print('优秀')
elif score >= 80:
    print('良好')
elif score >= 70:
    print('普通')
else:
    print('很差,小垃圾')
print('=====>')

猜你喜欢

转载自www.cnblogs.com/leilijian/p/12431348.html