一.深复制和浅复制
1.引用和赋值
引用是一个值,指向某些数据
列表引用是指向一个列表的值
当你将列表赋给你一个变量时,实际上是将列表的‘引用’赋给了改变变量。
id() : 在内存中一个独特的空间,相当于索引>>> a=[1,2,3]

b=a
id(a)
6699720
id(b)
6699720
b[0]=111
id(a)
6699720
id(b)
6699720
a
[111, 2, 3]
b
[111, 2, 3]
c=[1,2]
d=[1,2]
id(c)
7438408
id(d)
7438536
print(id(a)==id(b))
True

copy模块的copy()和deepcopy()
copy():复制第一层列表,完全指定在另外的空间,其他层次指定在同一片空间
deepcopy():完全复制过来,任何东西都不会被重复引用到同一个内存空间
浅复制机制:(copy)

import copy
a
[111, 2, 3]
c=copy.copy(a)
print(id(a)==id(c))
False
c[1]=333
c
[111, 333, 3]
a
[111, 2, 3]
a=[1,2,[3,4]]
d=copy.copy(a)
d
[1, 2, [3, 4]]
print(id(d)==id(a))
False
print(id(d[2])==id(a[2]))
True
d[2][0]=300
a
[1, 2, [300, 4]]
d
[1, 2, [300, 4]]

深复制:(deepcopy)

e=copy.deepcopy(a)
e
[1, 2, [300, 4]]
e[2][1]=4444
e
[1, 2, [300, 4444]]
a
[1, 2, [300, 4]]

二.控制流-条件判断

#if条件分支
age=eval(input('请输入你的年龄'))
#eval():自动转换为数据类型
if 18<=age<150:
print('你可以谈恋爱了!')
elif age>150:
print('妖姬')
else:
print('你没成年',end=',')
print('不能早恋')

案例一:输入一个数字,输出数字对应的星期几
num=eval(input('请输入一个数字:'))
if num==1:
print('星期一')
elif num==2:
print('星期二')
elif num==3:
print('星期三')
elif num==4:
print('星期四')
elif num==5:
print('星期五')
elif num==6:
print('星期六')
elif num==7:
print('星期日')
else:
print('输入数字不合法')

案例二:润年的判断(年份能被4整除但不能被100整除或者能被400整除)
num1=eval(input('请输入一个年份:'))
if (num1%4==0 and num1%100!=0) or num1%400==0:
print('是润年')
else:
print('不是闰年')

#年龄段的判断 (注意缩进)
age=eval(input('请输入你的年龄:'))
if 0< age<18:
pass (通过pass什么都不显示)
#print('你是个青少年')
else:
if 18<=age<30:
print('你是个年轻人')
else:
if 30print('中年人')
else:
if 65print('老年人')
else:
print('你是个异类')

二、循环语句
1.while
i=0 # 如果是i=1呢
while i<100: #那么i=101
print('<<三国演义>> 我看了%d集'%(i+1))
i=i+1
print ('总有看完了,哭成狗了')

break : 如果遇到beak语句,就会马上跳出while循环语句
continue :如果程序执行遇到continue,就会马上跳回到循环开始处,重新循环条件求值。

#死循环
#陷入无限循环中
while True:
print('love you')

for循环和range()函数
利用在条件为true时,while循环就会继续循环(这是它的名称的由来)。
但如果你项让一个代码块执行固定次数,该怎么办?
可以通过for循环语句和range()函数来实现。
【for语法】
【for 关键词
一个变量名
in 关键字
调用range()方法,最多传入3个参数
冒号
在下一行开始,缩进的代码块(称为for子句)】

range()
某些函数可以用多个参数调用,参数之间用的逗号分开,range()
就是其中之一可以改变传递给range()的整数,来实现各种整数序列
包括从0以外的值开始range(start,end,step)返回列表
start 起始值,end 终止值,step 步进值 默认为1

for i in range(1,101):
print ('我跑了%d圈'%i)
print ('我瘦了')

for i in range(100):
print('我跑了%d圈'%(i+1))
print ('我瘦了')

案例一
输入一个数值,输出从0到这个数的所有奇数。并且每隔10个数换一行
num=eval(input('请输入一个数值:'))
for i in range(1,num+1,2):
print(i,end=' ')
#每隔10个数换一行
if (i+1)%20==0:
print()

案例二
已知大公鸡5元,母鸡3元,小鸡1元1个。(百元买百鸡)
sum=100
#i、j、k分别表示公鸡,母鸡、小鸡的个数:
for i in range(20):
for j in range(33):
for k in range(0,100,3):
if i+j+k==sum and i5+j3+k/3==sum:
print('公鸡买了%d只,母鸡买%d只,小鸡买了%d只'%(i,j,k))

案例三
已知第一个数为1,第二个数为1,并且满足等式f(x)=f(x-1)+f(x-2),请计算房(100)的值。(斐波那契数列)
list1=[1,1]
for i in range(100)
list1[i].append(list1[i-1]+list1[i-2])

print(第%d项值%d'%(i,list1[i]))

print(list1[99])

图形输出
for i in range(1,9):
print(''i)

for i in range(9):
print(''(i+1))

U.异常捕获
语法:try .... except
异常:
在python程序中遇到错误,或异常,意味着整个程序崩溃。我们不希望这发生在真实世界的程序中,相反,你希望程序
能检测错误,处理他们,然后正常运行。
捕获异常:
一旦产生异常,就捕获他,然后进行一定处理。
目的就是为了保证程序的正常执行,不会产生异常而终止程序继续实行。
list1=[0,1]
try:
print(list2[2])
except NameError as e:
print(e)
except IndexError as e:
print(e)
except BaseException as e:
print(e)
print('程序正常运行')
print('程序正常运行')

函数:
def hello():
print('hello')
print('TOM!!')
print('Hello there')

hello()
hello()
hello()

a.第一行是def语句,它定义了一个名为hello()函数;
b.def语句之后的代码块是函数体,这段代码在函数调用是执行的
c.函数之后的hello()语句是函数调用。(函数调用就是函数名跟括号)

def hello(name):
print('hello,' +name)

hello('TOM')
hello('xp')
a.在这个程序的hello()函数定义中,有一个名为name的变元;
b.变员是一个变量,当函数调用时,参数就存放在其中。
c.保存在变元中的值,在函数返回就丢失了。

返回值和return语句
如果调用len()函数,并向他传入像‘hello’这样的参数调用就求值为整数5,这是传入的字符串长度
一般来说,函数调用求值的结果,成为函数的返回值。

a.return语句包含以下部分
.return 关键字
.函数应该返回的值或表达式
b.如果在return语句中使用了表达式,返回值就是该表达式求值的结果。
c.如果使用不带值得return语句(也就是中有return本身),那么久返回None.
1
def hello(name):
return '再见'
print(hello('周老师'))
2.
def hello(name):
return 或者pass
print(hello('周老师'))

摇奖小程序:
定义一个函数,它根据传入的数学参数,返回一个同的字符串

步骤:
1.导入随机数模块(import random)
2.构建一个函数体
3.产生随机数
4.调用函数
#导入随机数模块
import random
#产生一个1-9随机真正整数
a=random.randint(1,9)
#print(a)
def Answer(num):
if num==1:
return '一等奖'
elif num==2:
return '二等奖'
elif num==3:
return'三等奖'
elif num==4:
return '参与奖'
else:
return '谢谢参与'
print(Answer(a))

lambda表达式定义(也称为匿名函数)
a.lambda只是一个表达式,函数体比def简单
b.lamdba主体为一个表达式,不是代码块,仅仅能在lambda表达式中封装有限的逻辑进去。
(1)无参数形式
a=lambda:'ixp'
print (a())
(2)有参数形式:
a=lambda x:x**2
print (a(10))
(3)取出x的每一项,2倍数都部遍历出来
b=lamdba x:[i for i in x if i%2==0] #生成器
print b([1,2,3,4,5,6,])

#生成器
c=lambda x:[i for i in x if i%2==0]
#取出X的每一项,2的倍数全部遍历出来
print(c([1,2,3,4,5,6]))

Filter(),map(),reduce()
python内置了一些特殊函数,这些函数很具有python特性。
可以让代码更加简洁。filter,map,reduce三个函数比较类似,都是应用于序列的内置函数,常见的序列包括list、tuple、str.
通常与lambda表达式连用。

1.filter 函数
filter 函数会对指定序列执行过滤操作,批量提取。
filter 函数的定义:
filter (function or None,seq) -->list,tuple,or string
filter 函数会对序列参数sequence中的每个元素调用function函数,最后返回的结果包含调用结果为true的元素。

案例一:
取出列表里的能被3整除的元素
foo=[2,18,9,22,17,24,8,12,27]
print filter(lambda:xx%3==0,foo )

2.map函数
map函数会根据提供的函数对指定序列做批量处理。
map函数的定义
map(function,seq,[seq,...]) >list
通过定义可以看到,这个函数的第一个参数是一个函数,剩下的参数是一个或多个序列。
function可以理解为是一个一对一或多对一的函数,map的作用是以参数序列中的每个元素调用function函数,返回包含每次function函数
返回值得list.

案例二:
1.对一个序列中的每个元素进行平方运算:
map(lambda x:x**2,[1,2,3,4,5])

#map
b=map(lambda x:x**2,[1,2,3,4,5])
print (list(b))

2.对两个序列中的元素依次求和。
map(lambda x,y:x+y,[1,3,5,7,9],[2,4,6,8,10])
注意:在参数存在多个序列时,会依次以每个序列中相同位置的元素做参数调用function函数。

c=map(lambda x,y:x+y,[1,3,5,7,9],[2,4,6,8,10])
print(list(c))

3.当函数为None时。
map(None,[1,3,5,7,9],[2,4,6,8,10])
c=map(None,[1,3,5,7,9],[2,4,6,8,10])
print(c) (只能这样类型输出)

reduce函数
reduce函数会对参数序列中元素进行总体计算。
reduce函数的定义;
reduce(fuction,seq,initial)->value
function参数是一个有两个参数的参数,reduce依次从seq中取一个元素,和上次调用function
的结果做参数再次调用function.
第一次调用function时,如果提供inital参数,会以seq中的第一个元素和
inital作为参数调用function,否则会以序列seq中的前两个元素作参数调用function.
#reduce批量计算
#python3要引入模块functools
案例三:
1.reduce(lambda x,y:x+y,[2,3,4,5,6],1)
结果为21(((((1+2)+3)+4)+5)+6))
import functools
d=functools.reduce(lambda x,y:x+y,[2,3,4,5,6],1)
print(d)
#Y=1,x=2 x=x+y
#x=3,y=3
#x6,y=4
#x10,y=5
#x=15 ,y=6
#x=21
2.reduce(lambda x,y:x+y,[2,3,4,5,6])
结果为21(((((1+2)+3)+4)+5)+6))

import functools
d=functools.reduce(lambda x,y:x+y,[2,3,4,5,6])
print(d)
#Y=2,x=3
#x=5,y=4
#x9,y=5
#x14,y=6
#x=21
#否则会以序列seq中的前两个元素作参数调用function.
function不能为None

小结:
Filter 函数
语法:Filter(funtion or None.seq)
应用:对数据进行批量提取

map函数
语法:map(funtion,seq,[seq,...])
应用:对数据进行批量提取

Reduce函数
语法:reduce(funtion,sequence,[initial])
应用:对数据进行总体计算