
python知识点总结七
- 1、堆和栈的区别
- 2、如何在局部修改全局的变量
- a、计算结果
- b、计算结果
 
- 3、如何修改一个enclosing变量
- 4、关于值传递还是地址传值
- 5、布尔类型
- 6、逻辑运算
- 7、字符串切片操作
- 8、取整、取余、除数
- 9、变量赋值
- 10、字符串与数字相乘
- 11、整型、浮点型、字符型之间相互转换
- 12、关于*args和**kwargs
- 13、位运算符
- 14、计算结果
1、堆和栈的区别
栈(stack):
-  静态分配:栈是静态分配内存空间的区域,程序在运行时会自动分配和释放栈内存。 
-  内存空间有限:栈的内存空间有限,大小受限于操作系统的设定。栈一般用于存储函数调用时的局部变量和函数调用信息。 
-  内存分配由编译器管理:栈内存的分配和释放由编译器自动完成,不需要程序员手动干预。 
-  内存分配的时间开销较小:栈内存的分配和释放是由编译器自动完成的,效率高,不会涉及内存管理算法的处理。 
堆(Heap):
-  动态分配:堆是动态分配内存空间的区域,程序员可以手动申请和释放堆内存。 
-  内存空间较大:堆的内存空间较大,可以存储动态分配的大量数据。 
-  内存分配由程序员控制:程序员需要手动管理堆内存的分配和释放,如果分配了内存但没有释放,可能造成内存泄漏。 
-  内存分配的时间开销较大:堆内存的动态分配和释放需要进行内存管理算法的处理,会比较耗时。 
2、如何在局部修改全局的变量
a、计算结果
x = 1
print(id(x))  # todo 66666def foo():x = 10print(id(x))  # todo 88888foo()
print(id(x))  # todo 66666
print(x)  # todo 1
b、计算结果
x = 1
print(id(x))      # todo 66666def foo():global xprint(id(x))  # todo 66666x = 10print(id(x))  # todo 88888foo()
print(id(x))      # todo 88888
print(x)          # todo 10
3、如何修改一个enclosing变量
x = 1
def foo1():x = 10print(id(x))            # todo 6666def bar():nonlocal xprint(id(x))        # todo 6666x = 100print(id(x))        # todo 8888bar()print(x)                # todo 100f = foo1()
print(x)					# 1
4、关于值传递还是地址传值
def foo5(x):print(id(x))    # 2256896027216x = 20print(id(x))    # 1838202907536x = 10
print(id(x))        # 2256896027216
foo5(x)print(x)            # 10
print(id(x))        # 1838202907216      
def foo6(x):print(id(x))  # 2256896027216x.append(4)print(id(x))  # 2256896027216x = [1, 2, 3]
print(id(x))        # 2256896027216
foo6(x)
print(x)   
def foo7(x):print(id(x))  # 2638103028288x = 1000print(id(x))  # 重新赋值了  2638102718416x = [1, 2, 3]
print(id(x))  # 2638103028288
foo7(x)
print(x)  # [1, 2, 3]
lst = [33, 44, 55, 66]print(lst, id(lst))  #todo 2012092602048
lst.append(77)
print(lst, id(lst))  #todo [33, 44, 55, 66, 77] 2012092602048lst.extend([11, 22])
print(lst, id(lst))  #todo [33, 44, 55, 66, 77, 11, 22] 2012092602048
如果是不可变对象,在函数体的修改不会影响到实际参数的值,arg1的修改为100,不会影响到n1的值
 如果是可变对象,在函数体内的修改回影响到实际参数的值,arg2的修改,append(10),回影响到n2的值
5、布尔类型
零值:每一个数据类型都有一个布尔值为False的对象
print(bool(0))      #整型
print(bool(0.0))    #浮点型print(bool("False"))
print(bool("0"))
print(bool("-1"))
print(bool({}))
print(bool([]))
print(bool(()))
print(bool(set()))
执行结果
False
False
True
True
True
False
False
False
False

6、逻辑运算
逻辑运算:and、or、not
 真与真 真 ——》结果有假则假
 真与假 假
 假与真 假
 假与假 假
真或真 真 ——》结果有真则为真
 真或假 真
 假或真 真
 假或假 假
非真即假
 非假即真
 print(1 and 2) #2
 print(1 or 2) #1
 print(0 or 3) #3
先非 后与 再或
print(0 or 1 and 5)     #todo 5
str = '6>7'
print(eval(str))		False布尔值可以转成整数计算
print(True+1)      # 2
a = None
b = 200
print(a or b)  # 200a = 100
b = 200
print(a or b)  # 100
7、字符串切片操作
s='hello yuan'
print(s[1])
print(s[1:4])       #ell
print(s[1:4:-1])    #todo 空
print(s[-1:-4:1])   #todo 空
print(s[-4:-1:1])   #todo yua
print(s[4:1:-1])    #todo oll
print(s[::-1])    # 倒叙  nauy olleh
print(s[::-2])    # 倒叙  nu le
8、取整、取余、除数
取整:向下取整
print(19 // 3)  #todo 向下取整 6
print(19 / 3)   #todo 除数 6.333333333333333
print(19 % 3)   #todo 取余 1
print(-19 // 3)  # -7
print(-19 % 3)  # -19-(-7)*3=2print(9 // -4)  # todo -3   向下取整   一正一副的整数公式,向下取整
print(-9 // 4)  # todo -3   向下取整print(-8 % 3)  # todo 公式:余数=被除数-除数*商    -8-3*(-3)=1
print(8 % -3)  # todo 8-(-3)*(-3)=-1
9、变量赋值
a = 2
b = a
print(id(a))	# 1924360071504
print(id(b))	# 1924360071504
b += 2			# b开辟了一个新的内存空间
print(b)		# 4
print(a)		# 2print(id(a))	# 1924360071504
print(id(b))	#  1924360071568m = [1, 2]
n = m
n.append(3)
print(m)            #没有开辟新的内存地址 [1, 2, 3]
当多次赋值之后,变量名会指向新的空间
name='666'
name='888'
print(name)
10、字符串与数字相乘
字符串与数字相乘:相当于字符串拷贝了多少份
print("*"*4)   # ****
字符串与数字相加:报错
print("*" + 8)  #报错 
11、整型、浮点型、字符型之间相互转换
s1='128'
f1=98.7
s2='77.77'
f2=True
s3='hr=ello'
print('-----------int()函数,将其他数据类型转化为整数型-----------------')
print(int(s1))      #todo 128
print(int(f1))      #todo 98  将float转化为int类型:取整数部分,舍去小数部分
#print(int(s2))     #todo 将str转化为int类型,报错,因为字符串为小数串
print(int(f2))      #todo  1
#print(int(s3))     #todo 将str转化为int类型,字符串必须为数字串,而且为整数串
print('-----------float()函数,将其他数据类型转化为浮点型-----------------')
s1 = '128.88'
f1 = '78'
f2 = True
s3 = 'hello'
i = 98
print(float(s1))  # 128.88
print(float(f1))  # 78.0
print(float(f2))  # 1.0
# print(float(s3))   #   字符串中的数据类型如果是非数字类型,则不允许转换
print(float(i))  # 98.0
12、关于*args和**kwargs
def foo2(name, age, *args):print(args)foo2("123", '234', 'sdf')def bar3(path, func, **kwargs):print(kwargs)bar3('login', "login", method="get")
执行结果:
('sdf',)
{'method': 'get'}
13、位运算符
# todo 位运算符:将数据转化为二进制进行计算
print(4 & 8)  # 0   按位与&,同为1时结果为1print(4 | 8)  # 12  按位或|,同为0时结果为0# todo 左移位:高位溢出,低位补0  向左移1位相当于乘以2
# 向左移动1个位置
print(4 << 1)
# 向左移动2个位置
print(4 << 2)
# todo 右移位:高位补0,低位截断   向右移1位相当于除以2
# 向右移动1个位置
print(4 >> 1)
# 向右移动2个位置
print(4 >> 2)
14、计算结果
a = 10
b = 10
print(a == b)  # True
print(a is b)  #todo Truelst1 = [11, 22, 33]
lst2 = [11, 22, 33]
print(lst1 == lst2)  # True
print(lst1 is lst2)  #todo False
