python3-2笔记

发布时间:2019-09-25 08:16:40编辑:auto阅读(1831)

    一.深复制和浅复制
    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 30<age<=50:
    print('中年人')
    else:
    if 65<age<120:
    print('老年人')
    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])
    应用:对数据进行总体计算

关键字