一、内存管理
变量在动态语言中,无须事先声明,也不需要制定类型;
编程中一般无须关心变量的存亡,也不需要关心内存的管理;
Python使用"引用计数”记录所有对象的引用数
当对象引用数变为0,它就可以被"垃圾回收”GC
计算增加:赋值给其他变量就增加引用计数,例如X=3,Y=X
计数减少:函数运算结束时,局部变量就会被自动销毁,对象引用计数减少;
变量被赋值给其他对象。例如:x=3;y=x;x=4
当"引用计数”归0,即表示该对象不再被使用,垃圾回收机制会定期对"引用计数”标记为0的对象进行释放。
有关性能的时候,就需要考虑变量的引用问题,但是该释放内存,还是尽量不释放内存,看需求。
##相关问题###
内存空洞是如何产出的;
如何规避内存空洞;
内存回收优化方案;
二、程序控制
顺序执行
按照先后顺序一条条执行;
分支结构
根据不同的情况判断,条件满足执行某条件下的语句;
循环执行
条件满足就反复执行,不满足就不执行或不再执行;
if语句
if condition:
代码块
condition必须是一个bool类型,这个地方有一个隐式转换bool 参考"真值表”
真值表
对象/常量
值
总结
""
假
False等价布尔值,相当于bool(value)
空集合
空字符串
空字典
空列表
空元组
None对象
0
"string"
真
0
假
>=1
真
<&#61;-1
真
()空元组
假
[]空列表
假
{}空字典
假
None
假
多分支结构
if…elif…else语句
if condition1:
代码块1
elif condition2:
代码块2
elif condition3:
代码块3
……
else:
代码块
分支嵌套举例&#xff1a;
嵌套结构&#xff0c;可以是分支、循环的嵌套&#xff1b;
可以互相嵌套多层。
score&#61;80
if score<0:print(&#39;wrong&#39;)else:if score&#61;&#61;0:print(&#39;egg&#39;)elif score <&#61; 100:print(&#39;right&#39;)else:print(&#39;too big&#39;)
使用input函数
input函数获取键盘输入input([prompt])
查看帮助文档方法一&#xff1a;
查看帮助方法二&#xff1a;
注&#xff1a;Python中&#xff0c;下划线"_”是一个合法的标识符
同时也是一个特殊标识符&#xff0c;它指的是上一次output的结果
练习&#xff1a;
1.输入2个数字&#xff0c;输出最大数
a &#61; int(input(&#39;input a number:&#39;))
b&#61; int(input(&#39;input a number:&#39;))if a >b:print(a)else:print(b)
代码等效&#xff08;使用三元表达式&#xff1a;真值 if 条件 else 假值&#xff09;&#xff1a;
a &#61; int(input(&#39;input a number:&#39;))
b&#61; int(input(&#39;input a number:&#39;))print(a) if a > b else print(b)
2.给定一个不超过5位的正整数&#xff0c;判断其有几位
#使用if…elif…else…
a &#61; int(input(&#39;input a number:&#39;) )if a<10:print(1)elif a<100:print(2)elif a<1000:print(3)elif a<10000:print(4)elif a<100000:print(5)
代码优化方案——折半
newnumber &#61; int(input(&#39;number:&#39;))if newnumber >&#61; 100:if newnumber >&#61; 10000:print(5)elif newnumber >&#61; 1000:print(4)else:print(3)else:if newnumber >&#61; 10:print(2)else:print(1)
代码优化——使用len内置函数&#xff1a;
newnumber &#61; input(&#39;number:&#39;)
length&#61;len(newnumber)print(length)
循环结构——while循环和for循环
while语法&#xff1a;
while condition:
block
注&#xff1a;当条件满足condition为True&#xff0c;进入循环体&#xff0c;执行block
while举例&#xff1a;
flag &#61; 10
whileflag:print(flag)
flag-&#61; 1
注意边界&#xff0c;Python整型没有边界。
如果将上面代码改为"flag &#43;&#61; 1”便进入死循环。
for语法&#xff1a;
for element in iteratable:
block
注&#xff1a;当可迭代对象中有元素可以迭代&#xff0c;进入循环体&#xff0c;执行block
range函数
for和 range函数举例&#xff1a;打印1~10
for i in range(10):print(i&#43;1)
Range函数简介&#xff1a;前包后不包&#xff0c;range(起,止,步长)
例&#xff1a;
range(5) &#61;&#61;> range(0,5)&#61;&#61;>[0,5] &#61;&#61;> [0,1,2,3,4]
list(range(0,5,2))>>>[0,2,4]
循环中的 continue语句
中断当前循环的当次执行&#xff0c;继续下一次循环&#xff1b;
举例&#xff1a;计算10以内的偶数&#xff08;for循环&#xff09;
for i in range(10):if not i%2:print(i)
#引用range函数的步长
for i in range(0,10,2):print(i)
#引用continue
for i in range(10):if i%2:continue
print(i)
#引用位与运算
for i in range(10):if not i&0x01:print(i)
for i in range(10):if i&0x01:continue
print(i)
循环中的 break语句
终止当前循环
举例&#xff1a;计算1000以内的被7整除的前10个数&#xff08;for循环&#xff09;
count &#61;0for i in range (7,1000,7):print(i)
count&#43;&#61; 1
if count >&#61; 10:break
循环continue、break语句总结&#xff1a;
continue和break是循环的控制语句&#xff0c;只影响当前循环&#xff0c;包括while、for循环&#xff1b;
如果出现循环嵌套&#xff0c;continue和break也只影响语句所在的那一层循环&#xff1b;
continue和break不是跳出语句块&#xff0c;所以if cond:break 不是跳出if&#xff0c;而是终止if外的break所在的循环
for i in range(5):
for j in range(5):
if i>j:
print(666)
continue
if i>&#61;j:
print(555)
break
练习&#xff1a;给定一个不超过5位的正整数&#xff0c;判断该数的位数&#xff0c;依次打印出个位&#xff0c;十位、百位、千位、万位的数字
number &#61; int(input(&#39;>>>&#39;))
number*&#61; 10
while(number//10)!&#61;0:
number//&#61;10
print(number%10)
number &#61; int(input(&#39;>>>&#39;))
numberV&#61;len(str(number))fori inrange(numberV):print(number%10)
number&#61;number//10
将上面的结果反过来打印&#xff1a;
number &#61; int(input(&#39;>>>&#39;))
numberV&#61;len(str(number))
c&#61;numberfor i inrange(numberV):
v&#61;10**(numberV-i-1)
m&#61; c //vprint(m)
c-&#61; v*m
循环else子句语法
while condition:
block
else:
block
for element in iteratable:
block
else:
block
##如果循环正常的执行结束&#xff0c;就执行else子句&#xff1b;
##如果使用break终止&#xff0c;else子句不会执行。
for i in range(5):print(i)#if i > 3:
#break
#continue
else:print(&#39;OK&#39;)
练习&#xff1a;
一个整数&#xff0c;它加上100后是一个完全平方数&#xff0c;再加上168又是一个完全平方数&#xff0c;请问该数是多少&#xff1f;
程序分析&#xff1a;
假设该数为 x。
1、则&#xff1a;x &#43; 100 &#61; n2, x &#43; 100 &#43; 168 &#61; m2
2、计算等式&#xff1a;m2 - n2 &#61; (m &#43; n)(m - n) &#61; 168
3、设置&#xff1a; m &#43; n &#61; i&#xff0c;m - n &#61; j&#xff0c;i * j &#61;168&#xff0c;i 和 j 至少一个是偶数
4、可得&#xff1a; m &#61; (i &#43; j) / 2&#xff0c; n &#61; (i - j) / 2&#xff0c;i 和 j 要么都是偶数&#xff0c;要么都是奇数。
5、从 3 和 4 推导可知道&#xff0c;i 与 j 均是大于等于 2 的偶数。
6、由于 i * j &#61; 168&#xff0c; j>&#61;2&#xff0c;则 1
7、接下来将 i 的所有数字循环计算即可。
for i in range(1,85):if 168 % i &#61;&#61;0:
j&#61; 168 /i;if i > j and (i &#43; j) % 2 &#61;&#61; 0 and (i - j) % 2 &#61;&#61;0 :
m&#61; (i &#43; j) / 2n&#61; (i - j) / 2x&#61; n * n - 100
print(x)
练习&#xff1a;打印斐波那契数列
程序分析&#xff1a;斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列。
指的是这样一个数列如&#xff1a;0、1、1、2、3、5、8、13、21、34、……
程序分析&#xff1a;
F0 &#61;0(n&#61;0)F1 &#61;1(n&#61;1)Fn&#61;F[n-1]&#43;F[n-2](n&#61;>2)
方法一&#xff1a;
deffib(n):
a,b&#61; 1,1
for i in range(n-1):
a,b&#61; b,a&#43;breturna#输出了第10个斐波那契数列
print(fib(10))
方法二&#xff1a;使用递归
#使用递归
deffib(n):if n&#61;&#61;1 or n&#61;&#61;2:return 1
return fib(n-1)&#43;fib(n-2)#输出了第10个斐波那契数列
print(fib(10))
练习&#xff1a;打印一个边长为N的正方形
n &#61; 5
print(&#39;*&#39;*n)for i in range(n-2):print(&#39;*&#39;&#43;&#39; &#39;*(n-2)&#43;&#39;*&#39;)print(&#39;*&#39;*n)
#边长&#61;3&#xff0c;则-1 0 -1 &#61;>range(-1,2)#边长&#61;4&#xff0c;则-2 -1 0 1 &#61;>range(-2,2)#边长&#61;5&#xff0c;则-2 -1 0 1 2 &#61;>range(-2,3)
n &#61; 5e&#61; -n//2
for i in range(e,n&#43;e):if i &#61;&#61; e or i &#61;&#61; n&#43;e-1:print(&#39;*&#39;*n)else:print(&#39;*&#39; &#43; &#39; &#39;*(n-2) &#43; &#39;*&#39;)
练习&#xff1a;求100以内所有奇数的和
b &#61;0for i in range(1,100,2):
b&#43;&#61;iprint(b)
练习&#xff1a;打印九九乘法口诀表
for i in range(1,10):for o in range(1,i&#43;1):print(&#39;{}*{}&#61;{} &#39;.format(i,o,i*o),end&#61;&#39;&#39;)print()