• python基础二


    七、赋值与运算符

    定义两个变量,分别是a和b,a的值是10,b的值是20。

    算术运算符

    运算符描述实例
    + 加,两个对象相加 a+b=30
    - 减,两个对象相减,可能会得到负数 a-b=-10
    * 乘,两数相称或是返回一个被重复若干次的字符串 a*b=200
    / 除,两个对象相除 b/a=2
    % 取膜,返回除法的余数 b%a=0
    ** 幂,返回x的y次幂 a**b=100000000000000000000L
    // 整除余,返回商的整数部分 a//b=0

    比较运算符

    运算符描述实例
    == 等于,比较两个对象是否相等 a==b返回False
    != 不等于,比较两个对象是否不相等 a!=b返回True
    <> 不等于,比较两个对象是否不相等 a<>b返回True
    > 大于,比较x是否大于y, a>b返回False
    < 小于,比较x是否小于y a<b返回True
    >= 大于等于,比较x是否大于等于y a>=b返回False
    <= 小于等于,比较x是否小于等于y a<=b返回True

    赋值运算符

    运算符描述实例
    = 赋值运算符 c=a+b,将a+b的运算结果赋值给c
    += 加法复制运算符 c += a等效于c = c + a
    -= 减法复制运算符 c -= a等效于c = c - a
    *= 乘法复制运算符 c *= a等效于c = c * a
    /= 除法复制运算符 c /= a等效于c = c / a
    %= 取模赋值运算符 c %= a等效于c = c % a
    **= 幂赋值运算符 c **= a等效于c = c ** a
    //= 取整除赋值运算符 c //= a等效于c = c // a

    逻辑运算符

    运算符描述实例
    and “与” a and b返回true
    or “或” a or b返回true
    not “非” no(a and b)返回false

    成员运算符

    运算符描述
    in 如果在指定的序列中找到值返回True,否则返回False
    not in 如果在指定的序列中没有找到值返回True,否则返回false

    赋值语句的语法

    运算解释
    spam=’Spam’ 基本形式
    spam, ham=’yum’, ‘YUM’ 元组赋值运算
    [spam, han]=[‘yum’, ‘YUM’] 列表赋值运算
    a,b,c,d=’spam’ 序列赋值运算,通用性
    a, *b=’spam’ 扩展的序列解包
    spam = ham = ‘hello’ 多目标赋值运算
    spams += 42 增强赋值运算

    实例

    序列运算

    >>> nudge = 1
    >>> wink = 2
    >>> A, B = nudge, wink
    >>> A,B
    (1, 2)
    # 嵌套的方式
    >>> ((a, b), c) = ('SP', 'AM')
    >>> a, b, c
    ('S', 'P', 'AM')
    

    扩展的序列解包

    一个列表赋给了带星号的名称,该列表收集了序列中没有赋值给其他名称的所有项。

    先定义一个seq序列用于测试:

    >>> seq = [1, 2, 3, 4]
    

    a匹配序列中的第一项,b匹配剩下的内容

    >>> a, *b = seq
    >>> a, b
    (1, [2, 3, 4])
    

    b匹配序列中的最后一项,a匹配序列中最后一项之前的所有内容

    >>> *a, b = seq
    >>> a,b
    ([1, 2, 3], 4)
    

    第一项个最后一项分别赋值给了ac,而b获取了二者之间的所有内容。

    >>> *a, b, c = seq
    >>> a,b,c
    ([1, 2], 3, 4)
    

    带星号的名称可能只匹配单个的项,但是,总会向其复制一个列表,如果没有剩下的内容可以匹配那么会返回一个空列表:

    >>> a,b,c,*d = seq
    >>> print(a,b,c,d)
    1 2 3 [4]
    >>> a,b,c,d,*e = seq
    >>> print(a,b,c,d,e)
    1 2 3 4 []
    

    多目标赋值语句就是直接把所有提供的变量名都赋值给右侧的对象

    >>> a = b = c = 'As'
    >>> a,b,c
    ('As', 'As', 'As')
    # 所引用的值也都是同一个
    >>> id(a),id(b),id(c)
    (4331109208, 4331109208, 4331109208)

    八、流程控制

    if

    if就是一个条件判断的,当满足不同样的条件的时候执行不同的操作,如法如下:

    if <条件一>:
        <条件一代码块>
    elif <条件二>:
        <条件二代码块>
    else:
        <上面两个或者多个条件都不满足则只需这里的代码块>
    

    来一个小栗子:

    #!/use/bin/env python
    # _*_ coding:utf-8 _*_
    # 只需脚本是让用户输入一个数字,并把值赋值给变量n
    n = int(input("Pless Numbers: "))
    # 如果n大于10
    if n > 10:
        # 输出n > 10
        print("n > 10")
    # 如果n等于10
    elif n == 10:
        # 输出n == 10
        print("n == 10")
    # 否则
    else:
        # 输出n < 10
        print("n < 10")
    

    三元运算

    如果条件成立,那么就把值1赋值给var,如果条件不成立,就把值2赋值给var

    var = 1 if 条件 else 2
    

    例子

    >>> var = "True" if 1==1 else "False"
    >>> var
    'True'
    

    for循环

    for语句是python中的循环控制语句,可用来遍历某一对象,还具有一个附带的可选的else块,主要用于处理for语句中包含的break语句。

    >>> li = ['ansheng','eirc']
    >>> for n in  range(len(li)):
    ...  print(li[n])
    ...
    ansheng
    eirc  
    

    enumrate

    enumerate函数用于遍历序列中的元素以及它们的下标

    例如定义一个列表,内容有电脑,笔记本,手机,组装机,执行脚本的时候让用户选择商品,并且给商品加上序列:

    >>> li = ["电脑","笔记本","手机","组装机"]
    >>> for key,value in enumerate(li):
    ...  print(key,value)
    ...
    0 电脑
    1 笔记本
    2 手机
    3 组装机
    

    为了给用户良好的体验,需要要从1开始,然后用户如果输出相对应的序列那么就打印出序列对应的值:

    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    # 定义一个列表
    li = ["电脑","笔记本","手机","组装机"]
    # enumerate默认从0开始自增,我们可以改为从1开始自增
    for key,value in enumerate(li,1): 
        print(key,value)
    # 让用户选择商品的序列
    li_num = input("请选择商品:")
    # print输出的时候让序列减1
    print(li[int(li_num)-1])  
    

    执行结果如下

    1 电脑
    2 笔记本
    3 手机
    4 组装机
    请选择商品:1
    电脑
    

    range和xrange

    range()函数返回在特定区间的数字序列,range()函数的用法类似切片:range(start,stop,setup),start的默认值为0,即从0开始,stop的参数是必须输入的,输出的最后一个数值是stop的前一个,step的默认值是1,setup是步长

    >>> for n in range(5):
    ...  print(n)
    ...
    0
    1
    2
    3
    4
    

    反向输出

    >>> for n in range(5,-1,-1):
    ...  print(n)
    ...
    5
    4
    3
    2
    1
    0
    

    range在Python2.7与3.5的差别

    python 2.7.11

    >>> range(0,100)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
    

    range在Python2.7中,会把所有的序列都输出出来,没一个序列都在内存中占用一点空间

    xrange

    xrang不会一次性把序列全部都存放在内存中,而是用到for循环进行迭代的时候才会一个一个的存到内存中,相当于Python3.5中的range。

    >>> for i in xrange(1,10):
    ...  print(i)
    ...
    1
    2
    3
    4
    5
    6
    7
    8
    9
    

    python 3.5.1

    >>> range(1,100)
    range(1, 100)
    

    range在python3.5中就不会一次性的占用那么多空间,他会我需要用到这个序列的时候然后再内存中开辟一块空间给这个序列,不是一次性分完,相当于Python2.7.11中的xrange.

    while循环

    while循环不同于for循环,while循环是只要条件满足,那么就会一直运行代码块,否则就运行else代码块,语法如下:

    while <条件>:
    	<代码块>
    else:
    	<如果条件不成立执行这里的代码块>
    

    小栗子

    #!/use/bin/env python
    # _*_ coding:utf-8 _*_
    
    flag = True
    
    while flag:
       print(flag)
       flag = False
    else:
       print('else', flag)
    

    练习题

    元素分类

    有如下值集合 [11,22,33,44,55,66,77,88,99,90],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。 即: {‘k1’: 大于66的所有值, ‘k2’: 小于66的所有值}

    图解流程: 

    python-day02-06

    解答:

    #_*_coding:utf-8_*_
    
    num = [11,22,33,44,55,66,77,88,99,90]
    
    dict = {
    	'k1':[],
    	'k2':[]
    }
    
    for n in range(len(num)):
    	if num[n] <= 66:
    		dict['k1'].append(num[n])
    	else:
    		dict['k2'].append(num[n])
    
    print(dict.get("k1"))
    print(dict.get("k2"))
    
    • 输出结果
    [11, 22, 33, 44, 55, 66]
    [77, 88, 99, 90]
    

    查找

    查找列表中元素,移动空格,并查找以 a或A开头 并且以c结尾的所有元素。

    li = ["alec", " aric", "Alex", "Tony", "rain"]
    tu = ("alec", " aric", "Alex", "Tony", "rain") 
    dic = {'k1': "alex", 'k2': ' aric',  "k3": "Alex", "k4": "Tony"}
    
    • 列表的方式
    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    
    li = ["alec", " aric", "Alex", "Tony", "rain"]
    for n in range(len(li)):
        # 去掉左右两边的空格然后输出内容并且把首字母换成大写
        # string = str(li[n]).strip().capitalize()
        # 把字符串中的空格替换掉,然后首字母转换成大写
        string = str(li[n]).replace(" ","").capitalize()
        # 判断如果字符串的开头是大写字母"A"并且小写字母是"c"就print输出
        if string.find("A") == 0 and string.rfind("c") == len(string) - 1:
            print(li[n],"--->",string)
    

    输出的结果:

    alec ---> Alec
     aric ---> Aric
    
    • 元组的方式
    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    
    tu = ("alec", " aric", "Alex", "Tony", "rain")
    for n in range(len(tu)):
        # 去掉左右两边的空格然后输出内容并且把首字母换成大写
        # string = str(li[n]).strip().capitalize()
        # 把字符串中的空格替换掉,然后首字母转换成大写
        string = str(tu[n]).replace(" ","").capitalize()
        # 判断如果字符串的开头是大写字母"A"并且小写字母是"c"就print输出
        if string.find("A") == 0 and string.rfind("c") == len(string) - 1:
            print(tu[n],"--->",string)
    

    输出的结果

    alec ---> Alec
     aric ---> Aric
    
    • 字典的方式
    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    
    dic = {
        'k1': "alex",
        'k2': ' aric',
        "k3": "Alex",
        "k4": "Tony"
    }
    
    for key,val in dic.items():
        string = str(val).replace(" ","").capitalize()
        if string.find("A") == 0 and string.rfind("c") == len(string) - 1:
            print(key,val,"---",string)
    

    输出的结果

    k2  aric --- Aric
    

    输出商品列表

    用户输入序号,显示用户选中的商品

    商品

    li = ["手机", "电脑", '鼠标垫', '游艇']
    
    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    li = ["手机", "电脑", '鼠标垫', '游艇']
    for key,value in enumerate(li,1):
        print(key,".",value)
    li_num = input("请选择商品:")
    print(li[int(li_num)-1])
    

    执行结果

    1 . 手机
    2 . 电脑
    3 . 鼠标垫
    4 . 游艇
    请选择商品:1
    手机
    

    购物车

    功能要求: 要求用户输入总资产,例如:2000 显示商品列表,让用户根据序号选择商品,加入购物车 购买,如果商品总额大于总资产,提示账户余额不足,否则,购买成功。 附加:可充值、某商品移除购物车

    goods = [
        {"name": "电脑", "price": 1999},
        {"name": "鼠标", "price": 10},
        {"name": "游艇", "price": 20},
        {"name": "美女", "price": 998},
    ]
    
    • 逻辑图

    python-day02-08

    • 代码部分
    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    
    # 拥有的商品及价格
    goods = [
        {"name": "电脑", "price": 1999},
        {"name": "鼠标", "price": 10},
        {"name": "游艇", "price": 20},
        {"name": "美女", "price": 998},
    ]
    
    # 控制while循环开关
    switch = "on"
    
    # 购物车存放的商品及单价
    gouwuche = {
        # 商品列表
        "wuping":[],
        # 单价列表
        "jiage":[]
    }
    
    # 用户输入会员卡内余额
    while True:
        try:
            # 让用户输入会员卡内拥有的余额
            money = int(input("请输入你会员卡内的余额:"))
        # 异常判断,如果类型不是整型则执行except内的代码
        except ValueError:
            # 提示用户输入的格式错误,让其重新输入
            print("error,余额格式输入错误,请重新输入!
    例如:5000")
            # 终端当前循环让循环重新执行
            continue
        break
    
    # 进入购买商品的流程
    while switch == "on":
    
        # 打印出所有的商品
        print("
    ","序列","商品","单价")
        # 以序列的方式输出现拥有的商品及商品单价
        for num,val in enumerate(goods,1):
            for n in range(len(goods)):
                if num-1 == n:
                    print("  ",num,goods[n]["name"],goods[n]["price"])
    
        # 判断用户输入的序列是否规范
        while True:
            try:
                # 输入产品序列,类型转换为整型
                x = int(input("请选择商品序列:"))
    
            # 如果用户输入的非整型,提示用户重新输入
            except ValueError:
                print("error,请选择商品的序列")
                continue
    
            # 如果用户输入的序列不再产品序列当中让用户重新输入
            if x > num:
                print("error,请选择商品的序列")
                continue
            break
    
        # 输出购买物品的信息
        print("你已经把商品",goods[x-1]["name"],"加入购物车","物品单价是:",goods[x-1]["price"],"
    ")
        # 把物品名称放入gouwuche的wuping列表中
        gouwuche["wuping"].append(goods[x-1]["name"])
        # 把物品单价放入gouwuche的jiage列表中
        gouwuche["jiage"].append(goods[x-1]["price"])
    
        # 用户输入选项
        while switch == "on":
            # 输出现有选项
            print("查看购物车:p 结算:w 删除商品:d 继续购买:n 充值:i 显示余额:m 退出:q")
            # 把用户输入的选项转换为字符串
            xx = str(input("请输入你的选择:"))
    
            # 如果用户输入的是p则列出当前购物车内的商品名称
            if xx == "p":
                # 以序列的方式输出字典gouwuche内的wuping列表
                for wp_num,val in enumerate(gouwuche["wuping"], 1):
                    print(wp_num, val)
    
            # 如果用户输入的是w则结算
            elif xx == "w":
                # 定义一个默认的变量为用户商品的总金额
                zje = 0
                # 把gouwuche中的jiage列表内的整数进行相加并复制给zje
                for n in range(len(gouwuche["jiage"])):
                    zje = zje + gouwuche["jiage"][n]
                # 如果商品的总金额大于用户会员卡内的余额,则提示用户钱不够
                if zje > money:
                    print("sorry, 钱不够哦~~
    ")
                # 否则就退出程序,并且输出用户本次消费的情况
                else:
                    switch = "off"
                    print("购物愉快,您本次消费",zje,"RMB","还剩余",money-zje,"RMB")
    
            # 如果用户输入的是d则进入删除购物车内的商品界面
            elif xx == "d":
                # 首先输出用户购物车内的商品列表
                for wp_num, val in enumerate(gouwuche["wuping"], 1):
                    print(wp_num, val)
                # 选择所删除商品的序列
                while True:
                    try:
                        deltet = int(input("请选择要删除的商品序列:"))
                    except ValueError:
                        print("error,请输出正确的序列!")
                        continue
                    if deltet > wp_num:
                        print("error,请选择商品的序列")
                        continue
                    # 提示用户购物车内被删除的商品信息
                    print("你已经删除产品", gouwuche["wuping"][deltet - 1], "单价为;", gouwuche["jiage"][deltet - 1])
                    # 删除商品
                    gouwuche["wuping"].pop(deltet - 1)
                    # 删除金额
                    gouwuche["jiage"].pop(deltet - 1)
                    break
    
            # 如果用户输入的是i则进入用户会员卡充值页面
            elif xx == "i":
                # 判断用户输入的银行卡号格式是否正确
                while True:
                    try:
                        user = int(input("请输入你的银行卡账号:"))
                    except ValueError:
                        print("error,卡号格式输入错误,请重新输入..")
                        continue
                    break
    
                # 判断用户输入的银行卡密码格式是否正确
                while True:
                    try:
                        pwd = int(input("请输入银行卡的密码:"))
                    except ValueError:
                        print("error,密码格式输入错误,请重新输入..")
                        continue
                    break
                # 判断用户输入的账号和密码是否正确,默认的账号和密码都是123
                if user == 123 and pwd == 123:
                    # 如果正确就让用户输入要充值的金额
                    while True:
                        try:
                            newmoney = int(input("请输入充值的金额:"))
                        except ValueError:
                            print("error,金额格式输入错误,请重新输入..")
                            continue
                        break
                    # 余额加上充值的金额
                    money = money + newmoney
                    # 输出本次充值的信息
                    print("你已成功充值",newmoney,"RMB,现在账户余额为:",money,"RMB
    ")
                # 如果用户银行卡账号或密码错误,就提示用户输入错误,让后让用户重新选择
                else:
                    print("银行卡账号或密码错误.
    ")
    
            # 如果用户输入的是m则显示用户会员卡内的余额
            elif xx == "m":
                print("账户余额:",money,"
    ")
    
            # 如果用户输入的是q则退出程序
            elif xx == "q":
                # 把变量switch的值改为off
                switch = "off"
    
            # 如果用户输入的是n则继续购买商品
            elif xx == "n":
                break
    
            # 如果用户没有输入以上的任意一个选项则让用户重新输入
            else:
                print("请输出正确的选项!")
    
    • 执行结果
    请输入你会员卡内的余额:1000
    
     序列 商品 单价
       1 电脑 1999
       2 鼠标 10
       3 游艇 20
       4 美女 998
    请选择商品序列:1
    你已经把商品 电脑 加入购物车 物品单价是: 1999 
    
    查看购物车:p 结算:w 删除商品:d 继续购买:n 充值:i 显示余额:m 退出:q
    请输入你的选择:i
    请输入你的银行卡账号:123
    请输入银行卡的密码:123
    请输入充值的金额:2000
    你已成功充值 2000 RMB,现在账户余额为: 3000 RMB
    
    查看购物车:p 结算:w 删除商品:d 继续购买:n 充值:i 显示余额:m 退出:q
    请输入你的选择:m
    账户余额: 3000 
    
    查看购物车:p 结算:w 删除商品:d 继续购买:n 充值:i 显示余额:m 退出:q
    请输入你的选择:p
    1 电脑
    查看购物车:p 结算:w 删除商品:d 继续购买:n 充值:i 显示余额:m 退出:q
    请输入你的选择:d
    1 电脑
    请选择要删除的商品序列:1
    你已经删除产品 电脑 单价为; 1999
    查看购物车:p 结算:w 删除商品:d 继续购买:n 充值:i 显示余额:m 退出:q
    请输入你的选择:p
    查看购物车:p 结算:w 删除商品:d 继续购买:n 充值:i 显示余额:m 退出:q
    请输入你的选择:n
    
     序列 商品 单价
       1 电脑 1999
       2 鼠标 10
       3 游艇 20
       4 美女 998
    请选择商品序列:4
    你已经把商品 美女 加入购物车 物品单价是: 998 
    
    查看购物车:p 结算:w 删除商品:d 继续购买:n 充值:i 显示余额:m 退出:q
    请输入你的选择:w
    购物愉快,您本次消费 998 RMB 还剩余 2002 RMB
    

    三级联动

    用户交互,显示省市县的选择

    dic = {
        "河北": {
            "石家庄": ["鹿泉", "藁城", "元氏"],
            "邯郸": ["永年", "涉县", "磁县"],
        },
        "河南": {
            ...
        },
        "山西": {
            ...
        }
    }
    
    • 流程图解

    python-day02-09

    • 代码如下
    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    
    # 定义一个拥有省市县的字典
    dic = {
        "河北": {
            "石家庄": ["鹿泉", "藁城", "元氏"],
            "邯郸": ["永年", "涉县", "磁县"],
        },
        "河南": {
            "郑州市":["中原区","二七区","金水区"],
            "洛阳市":["涧西区","西工区","老城区"]
        },
        "山西": {
            "太原市":["迎泽区","杏花岭区","万柏林区"],
            "大同市":["大同县","天镇县","浑源县"]
        }
    }
    
    # 控制while循环的开关
    switch = "on"
    
    # 执行脚本就显示已经进入中国
    print("
    你已进入中国
    ")
    
    # 开始执行while循环
    while switch == "on":
    
        # 省得列表
        sheng = []
        # 市的列表
        shi = []
        # 镇的列表
        zhen = []
    
        # 让用户选择进入的生
        while switch == "on":
            # 输出省得列表
            for sheng_n, sheng_v in enumerate(dic, 1):
                print(sheng_n, sheng_v)
                sheng.append(sheng_v)
            # 用户输出选择进入的省
            try:
                # 用户输入的必须为整数
                sheng_inp = int(input("请选择你要进入的城市序列:"))
            except ValueError:
                # 如果不是整数就报错然后让用户重新输入
                print("序列输入错误,请重新输入")
                continue
            # 如果用户输入的证书是0或者大于列表的序列就让用户重新输入
            if sheng_inp > sheng_n or sheng_inp == 0:
                print("序列输入错误,请重新输入")
                continue
            # 输入正确之后输出用户当前在哪里
            print("
    你已进入中国--->", sheng[sheng_inp - 1], "
    ")
    
            # 选项
            while True:
                # 输出选项
                ify = input("b 返回上一级
    n 继续
    q 退出
    请输入你的选择:")
                # 如果用户输入的是指定的字母就退出当前循环
                if ify == "q" or ify == "b" or ify == "n":
                    break
                # 如果不是指定字母就让用户重新输入
                else:
                    print("输入错误,请重新输入!")
                    continue
            # 如果用户输入的是b就返回上一级
            if ify == "b":
                continue
            # 如果用户输入的是q那么就把变量switch值改为off
            elif ify == "q":
                switch = "off"
                continue
            # 如果用户输入的是n就继续让用户选择市,注释就写到这儿把,下面的代码就相当于让用户重新选择省,只不过省改为市了
    
            while switch == "on":
                for shi_n, shi_v in enumerate(dic[sheng[sheng_inp - 1]], 1):
                    print(shi_n, shi_v)
                    shi.append(shi_v)
                try:
                    shi_inp = int(input("请选择你要进入的城市序列:"))
                except ValueError:
                    print("序列输入错误,请重新输入")
                    continue
                if shi_n < shi_inp or shi_inp == 0:
                    print("序列输入错误,请重新输入")
                    continue
                print("
    你已进入中国--->", sheng[sheng_inp - 1], "--->",shi[shi_inp - 1])
    
                while True:
                    ify = input("b 返回上一级
    n 继续
    q 退出
    请输入你的选择:")
                    if ify == "q" or ify == "b" or ify == "n":
                        break
                    else:
                        print("输入错误,请重新输入!")
                        continue
                if ify == "b":
                    continue
                elif ify == "q":
                    switch = "off"
                    continue
    
                while switch == "on":
                    for zhen_n, zhen_v in enumerate(dic[sheng[sheng_inp - 1]][shi[shi_inp - 1]], 1):
                        print(zhen_n, zhen_v)
                        zhen.append(zhen_v)
                    try:
                        zhen_inp = int(input("请选择你要进入的城市序列:"))
                    except ValueError:
                        print("序列输入错误,请重新输入")
                        continue
                    if zhen_n < zhen_inp or zhen_inp == 0:
                        print("序列输入错误,请重新输入")
                        continue
                    print("
    你已进入中国--->", sheng[sheng_inp - 1], "--->", shi[shi_inp - 1],"--->",zhen[zhen_inp - 1])
                    while True:
                        ify = input("b 返回上一级
    n 继续
    q 退出
    请输入你的选择:")
                        if ify == "q" or ify == "b" or ify == "n":
                            break
                        else:
                            print("输入错误,请重新输入!")
                            continue
                    if ify == "b":
                        continue
                    elif ify == "q":
                        switch = "off"
                        continue
    
    • 执行结果
    你已进入中国
    
    1 山西
    2 河南
    3 河北
    请选择你要进入的城市序列:2
    
    你已进入中国---> 河南 
    
    b 返回上一级
    n 继续
    q 退出
    请输入你的选择:n
    1 郑州市
    2 洛阳市
    请选择你要进入的城市序列:1
    
    你已进入中国---> 河南 ---> 郑州市
    b 返回上一级
    n 继续
    q 退出
    请输入你的选择:b
    1 郑州市
    2 洛阳市
    请选择你要进入的城市序列:2
    
    你已进入中国---> 河南 ---> 洛阳市
    b 返回上一级
    n 继续
    q 退出
    请输入你的选择:n
    1 涧西区
    2 西工区
    3 老城区
    请选择你要进入的城市序列:1
    
    你已进入中国---> 河南 ---> 洛阳市 ---> 涧西区
    b 返回上一级
    n 继续
    q 退出
    请输入你的选择:q

    九、深浅拷贝

    深浅拷贝

    深浅拷贝分为两部分,一部分是数字和字符串另一部分是列表、元组、字典等其他数据类型。

    数字和字符串

    对于数字字符串而言,赋值、浅拷贝和深拷贝无意义,因为他们的值永远都会指向同一个内存地址。

    # 导入copy模块
    >>> import copy
    # 定义一个变量var1
    >>> var1 = 123
    # 输出var1的内存地址
    >>> id(var1)
    1347747440
    >>> var2 = var1
    # var2的内存地址和var1相同
    >>> id(var2)
    1347747440
    # 浅拷贝
    >>> var3 = copy.copy(var1)
    # var3的内存地址和var1相同
    >>> id(var3)
    1347747440
    # 深拷贝
    >>> var4 = copy.deepcopy(var1)
    # var4的内存地址和var1相同
    >>> id(var4)
    1347747440
    

    其他数据类型

    对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。

    • 创建一个字典var1
    var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
    

    赋值

    赋值,只是创建一个变量,该变量指向原来内存地址,如:

    >>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
    >>> var2 = var1
    >>> id(var1)
    1937003361288
    >>> id(var2)
    1937003361288
    

    如图所示:

    Python-Day04-01

    浅拷贝

    浅拷贝,在内存中只额外创建第一层数据

    # 导入拷贝模块
    >>> import copy
    >>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
    # 使用浅拷贝的方式
    >>> var2 = copy.copy(var1)
    # 两个变量的内存地址是不一样的
    >>> id(var1)
    2084726354952
    >>> id(var2)
    2084730248008
    # 但是他们的元素内存地址是一样的
    >>> id(var1["k1"])
    2084726207464
    >>> id(var2["k1"])
    2084726207464
    

    如图所示:

    Python-Day04-02

    深拷贝

    深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

    # 导入拷贝模块
    >>> import copy
    >>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
    # 使用深拷贝的方式把var1的内容拷贝给var2
    >>> var2 = copy.deepcopy(var1)
    # var1和var2的内存地址是不相同的
    >>> id(var1)
    1706383946760
    >>> id(var2)
    1706389852744
    # var1和var2的元素"k3"内存地址是不相同的
    >>> id(var1["k3"])
    1706389853576
    >>> id(var2["k3"])
    1706389740744
    # var1和var2的"k3"元素的内存地址是相同的
    >>> id(var1["k3"][1])
    1706383265744
    >>> id(var2["k3"][1])
    1706383265744
    

    如图所示:

    Python-Day04-03

     

     

    十、函数

    函数

    函数是Python为了代码最大程度的重用和最小化代码冗余而提供的最基本的程序结构。

    1. 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
    2. 面向对象:对函数进行分类和封装,让开发“更快更好更强…”

    函数式编程最重要的是增强代码的重用性和可读性

    创建的函数语法

    def 函数名(参数):
        ...
        函数体
        ...
        返回值
    

    简单的实例

    # x为函数的参数
    >>> def num(x):
    ...  print(x)
    ...
    # 123456等于x
    >>> num("123456")
    123456
    

    函数的返回值

    函数的返回值需要使用到return这个关键字,返回值主要是用来接受函数的执行结果

    >>> def re():
    ...   if 1==1:
    ...     return True
    ...   else:
    ...     return False
    ...
    >>> re()
    True
    

    函数return后面是什么值,re就返回什么值,如果没有指定return返回值,那么会返回一个默认的参数None

    在函数中,当return执行完成之后,return后面的代码是不会被执行的

    >>> def ret():
    ...  print("123")
    ...  return True
    ...  print("abc")
    ...
    >>> ret()
    123
    True
    

    位置参数

    传入参数的值是按照顺序依次赋值过去的。

    代码

    # x==形式参数,形式参数有几个,那么实际参数就要传几个,默认参数除外
    def ret(x):
        print(x)
    # "Hello Word"实际参数
    print(ret("Hello Word"))
    

    执行结果

    Hello Word
    

    如图所示: Python-Day04-04

    ret小括号内的值会被传入到函数ret里面都能做x的值,结果差不多就是print("Hello Word")

    函数的普通参数实例:发送邮件

    def email(mail):
        import smtplib
        from email.mime.text import MIMEText
        from email.utils import formataddr
    
        msg = MIMEText('邮件内容', 'plain', 'utf-8')
        msg['From'] = formataddr(["测试",'asdasd@126.com'])
        msg['To'] = formataddr(["走人",'asdasdasd@163.com'])
        msg['Subject'] = "主题"
    
        server = smtplib.SMTP("smtp.126.com", 25)
        server.login("wdfgfghfgh@126.com", "123456")
        server.sendmail('asdasdas@126.com', [mail,], msg.as_string())
        server.quit()
    
    email("6087414@qq.com")
    

    当执行这个脚本的时候会给邮箱6087414@qq.com发送邮件。

    注:上面的邮箱地址等都是随便写的,请自行更改

    指定参数

    >>> def ret(a,b,c):
    ...  print(a,"a")
    ...  print(b,"b")
    ...  print(c,"c")
    ...
    >>> ret(b="bbb",a="aaa",c="ccc")
    aaa a
    bbb b
    ccc c
    

    默认情况在再函数ret括号内如果要输入函数参数的值,是要按照顺序来的,但是如果在ret括号内制定的参数的值,那么就不需要按照顺序来了。

    默认参数

    如果我们在创建函数的时候给函数定义了值,那么在调用函数的时候如果不填写值程序就会报错:

    >>> def ret(x):
    ...  print(x)
    ...
    >>> ret()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: ret() missing 1 required positional argument: 'x'
    

    如果要解决这个问题就可以给函数的值指定一个默认值,指定函数的默认值需要在def这一行指定,制定之后,当调用这个函数的时候就不需要输入函数值了。

    >>> def ret(x="Hello Word"):
    ...  print(x)
    ...
    >>> ret()
    Hello Word
    # 如果值指定默认值,那么实际参数替换掉形式参数
    >>> ret("Pythoner")
    Pythoner
    

    如果给函数创建了默认值,那么有默认值的这个参数必须在最后面定义,不能够在没有默认参数的值的前面。

    动态参数

    动态参数把接收过来的实际参数当作一个元组,每一个参数都是元组中的一个元素。

    第一种动态参数

    定义第一种动态参数需要在参数前面加上一个*

    >>> def ret(*args):
    ...  print(args,type(args))
    ...
    >>> ret(11,22,33)
    (11, 22, 33) <class 'tuple'>

    第二种动态参数

    定义第二种动态参数需要在参数前面加上两个*号,给参数传参的时候是一个key对应一个value的,相当于一个字典的键值对,而且返回的类型就是字典类型。

    使用两个星号可以将参数收集到一个字典中,参数的名字是字典的键,对应参数的值是字典的值。

    >>> def ret(**kwargs):
    ...  print(kwargs,type(kwargs))
    ...
    >>> ret(k1=123,k2=456)
    {'k1': 123, 'k2': 456} <class 'dict'>

    第三种动态参数

    第三种又称为万能的动态参数,如下实例:

    >>> def ret(*args,**kwargs):
    ...  print(args,type(args))
    ...  print(kwargs,type(kwargs))
    ...
    >>> ret(11,222,333,k1=111,k2=222)
    (11, 222, 333) <class 'tuple'>
    {'k1': 111, 'k2': 222} <class 'dict'>

    字典小例子:

    >>> def arg(**kwargs):
    ...  print(kwargs,type(kwargs))
    ...
    >>> dic = {"k1":123,"k2":456}
    >>> arg(k1=dic)
    {'k1': {'k1': 123, 'k2': 456}} <class 'dict'>
    >>> arg(**dic)
    {'k1': 123, 'k2': 456} <class 'dict'>

    避免可变参数的修改

    如果不想在函数内部修改参数值而影响到外部对象的值,我们可以使用切片的方式进行参数的传递:

    #!/use/bin/env python
    
    L = ['a', 'b']
    def changer(L):
        L[0] = 0
    print(L)
    changer(L)
    """
    ['a', 'b']
    [0, 'b']
    """
    # changer(L[:])
    """
    ['a', 'b']
    ['a', 'b']
    """
    print(L)
    

    参数解包

    In [2]: def f(a, b, c, d): print(a, b, c, d)
    
    In [3]: args = (1, 2)
    
    In [4]: args += (3, 4)
    
    In [5]: f(*args)
    1 2 3 4
    

    又或者使用

    def f(a, b, c, d): print(a, b, c, d)
    args = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
    f(**args)
    

    参数书写位置

    在函数调用中: 位置参数 –》 关键字参数 –》元组形式–》字典形式 在函数头部: 一般参数–》默认参数–》元组形式–》字典形式

    def func(name, age=None, *args, **kwargs):
        print(name, age, args, kwargs)
    
    func('ansheng', 18, *(1, 2, 3), **{'blog': 'blog.ansheng.me'})
    

    全局变量和局部变量

    简单的理解全局变量和变量,全局变量可以理解为在当前这个文件内定义的变量,局部变量则是在函数内定义的变量,如下例:

    # qa
    # 全局变量
    n1 = 1
    def num():
    	# 局部变量
        n2 = 2
        print(n1)
        print(n2)
    num()
    

    输出的结果

    1
    2
    

    定义的全局变量都可以在函数内调用,但是不能再函数内修改,局部变量在也不能够直接调用,如果要在函数内修改全局变量,那么就需要用到关键字``

    n1 = 1
    def num():
        n2 = 2
        global n1
        n1 = 3
        print(n1)
        print(n2)
    num()
    

    执行结果

    3
    2
    

    nonlocal语句

    nonlocal是用来修改嵌套作用域中的变量,类似于global一样,只需要在嵌套函数中声明变量名即可,但是这个变量名是必须已经存在的否则就会报错,如果要修改的变量在作用域中查找不到,那么不会继续到全局或内置作用域中查找。

    In [1]: def func1(arg1):
       ...:     n = arg1
       ...:     print(n)
       ...:     def func2():
       ...:         nonlocal n
       ...:         n += 1
       ...:     func2()
       ...:     print(n)
       ...:     
    
    In [2]: func1(10)
    10
    11
    

    Lambda表达式

    Lambda(Lambda expressions)表达式是用lambda关键字创建的匿名函数,Lambda函数可以用于任何需要函数对象的地方,在语法上,它们被局限于只能有一个单独的表达式。

    使用Lambda表达式创建函数

    >>> f = lambda x,y : x + y
    >>> f(1,2)
    3
    

    使用def创建函数

    >>> def f(x,y):
    ...  return x + y
    ...
    >>> f(1,2)
    3
    

    对于比较简单的函数我们就可以通过lambda来创建,它的的好处是缩短行数。

    lambda创建的函数和def创建的函数对应关系如图所示:

    Python-Day05-01

    嵌套lambda和作用域

    def action(x):
        return (lambda y: x + y)
    
    act = action(99)
    print(act)
    result = act(2)
    print(result)
    

    输出为:

    <function action.<locals>.<lambda> at 0x1021e6400>
    101
    

    lambda也能够获取到任意上层lambda中的变量名:

    action = lambda x: (lambda y: x + y)
    act = action(99)
    print(act)
    result = act(3)
    print(result)
    

    输出为:

    <function <lambda>.<locals>.<lambda> at 0x1029e6400>
    102
    

    测试题

    第一题

    简述普通参数、指定参数、默认参数、动态参数的区别

    普通参数即是用户在调用函数是填入的参数,且参数位置必须与参数保持一致。

    指定参数即在用户调用函数的时候不需要按照函数中参数的位置中所填写,指定参数是需要制定参数对应的值。

    默认参数可以写在定义参数的后面,如果用户调用函数是没有制定参数,那么就会用默认参数,如果用户指定了参数,那么用户指定的参数就会代替默认参数。

    动态参数可以接受用户输入的任何参数,包括字典、列表、元组等数据类型。

    第二题

    计算传入字符串中数字、字母、空格以及其他的个数

    def var(s):
        all_num = 0
        spance_num = 0
        digit_num = 0
        others_num = 0
        for i in s:
            # 检测数字
            if i.isdigit():
                digit_num += 1
            # 检测空格
            elif i.isspace():
                spance_num += 1
            # 检测字母
            elif i.isalpha():
                all_num += 1
            else:
                # 其他
                others_num += 1
        return ("字母:",all_num,"空格:",spance_num,"数字",digit_num,"其他字符",others_num)
    num = var("21323 asd*%^*^% &*213asdasdasda sdasdasd")
    print(num)
    

    执行结果

    ('字母:', 21, '空格:', 3, '数字', 8, '其他字符', 8)
    

    第三题

    写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5,如果大于5就返回True,如果小于5就返回False

    # 定义一个函数num
    def num(x):
        # 判断函数的值如果长度大于5就返回True
        if len(x) > 5:
            return True
        # 否则就返回False
        else:
            return False
    
    ret = num(["asd","asdasd","asdasd","asdasd"])
    print(ret)
    ret = num("asdasdasd")
    print(ret)
    

    第四题

    写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容,如果有空就返回False

    # 定义一个函数num
    def num(x):
        # 循环输出num内的所有内容
        for n in x:
            # 数据类型转换为字符串
            n = str(n)
            # 如果有空格就返回False
            if n.isspace():
                return False
    
    ret = num(" ")
    print(ret)
    
    ret = num("asdasd")
    print(ret)
    
    ret = num(["asd","312",123," "])
    print(ret)
    

    第五题

    写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

    def num(x):
        # 如果列表中的长度大于2,那么就输出列表前两个内容,否则就返回一个空
        if len(x) > 2:
            return x[:2]
        else:
            return ""
    print(num(["11","22","33"]))
    
    print(num(["33"]))
    

    第六题

    写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。

    def num(x):
        # 定义一个空列表用于接收奇数位的元素
        resule = []
        # 循环输出列表中的所有元素值
        for n in range(len(x)):
            # 如果列表中的位置为奇数就把值添加到resule列表中
            if n % 2 == 1:
                resule.append(x[n])
        # 然会resule列表中的内容
        return resule
    
    ret = num([11,22,33,44,55,66])
    print(ret)
    

    第七题

    写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

    dic = {"k1": "v1v1", "k2": [1111,22,33,44]}
    

    PS:字典中的value只能是字符串或列表

    代码

    def dictt(x):
        # 循环字典中所有的key
        for k in x.keys():
            # 如果字典中k对应的元素是字符串类型就下面的判断
            if type(x[k]) == str:
                # 如果元素的长度大于2
                if len(x[k]) > 2:
                    # 那么就让这个元素重新赋值,新的值只保留原来值的前两个
                    x[k]=x[k][0:2]
            # 如果字典中k对应的元素类型是列表,就进入下面的判断
            elif type(x[k]) == list:
                # 先把列表中的值全部for循环
                for i in x[k]:
                    # 把元素转换为字符串
                    string = str(i)
                    # 如果元素的长度大于2
                    if len(string) > 2:
                        # 获取元素的索引值
                        num = x[k].index(i)
                        # 先把这个元素给删除
                        x[k].pop(x[k].index(i))
                        # 然后再添加一个新的元素,新元素的只保留原来元素的前两个
                        x[k].insert(num,string[:2])
        # 把结果return出来
        return dic
    ret = dictt(dic)
    print(ret)
    
    • 执行结果
    {'k1': 'v1', 'k2': ['11', 22, 33, 44]}
     

    十一、模块默认全局变量

    默认全局变量

    变量名说明
    __doc__ py文件的注释,是对文件的注释
    __file__ 获取当前文件路径
    __package__ 返回导入的文件所在包,用.分隔,如果是当前文件则返回None
    __cached__ 返回导入的其他文件pyc文件路径,当前文件返回None
    _name_ 如果是主文件则返回__main__ 否则等于模块名

    没有列出来的就是没必要许了解的

    实例

    返回scripts文件的注释及文件路径

    [root@ansheng ~]# cat scripts.py 
    #!/usr/bin/env pyton
    # 文件的注释顶格写
    """  Python file comments """
    # 输出文件注释
    print("comments",__doc__)
    # 输出文件路径
    print("file path",__file__)
    

    执行脚本

    [root@ansheng ~]# python scripts.py 
    ('comments', '  Python file comments ')
    # 如果是当前文件则直接返回文件名
    ('file path', 'scripts.py')
    

    __name__函数的应用

    查看当前目录下面的文件及文件内容

    [root@ansheng ~]# ls -l
    total 8
    drwxr-xr-x 2 root root 4096 May 24 21:36 lib
    -rw-r--r-- 1 root root   80 May 24 21:37 scripts.py
    [root@ansheng ~]# ls -l lib/
    total 12
    -rwxr-xr-x 1 root root  54 May 24 21:36 f1.py
    -rw-r--r-- 1 root root   0 May 24 21:34 __init__.py
    [root@ansheng ~]# cat lib/f1.py
    #!/usr/bin/env python
    def echo():
     print("lib/f1.py")
    [root@ansheng ~]# cat scripts.py 
    #!/usr/bin/env pyton
    from lib import f1
    
    if __name__ == "__main__":
      f1.echo()
    
    
    执行`scripts.py`脚本,脚本会调用`lib/f1.py`文件,而`lib/f1.py`文件会输出`lib/f1.py`,所以执行`scripts.py`文件的时候自然也会输出`lib/f1.py`
    
    ```bash
    [root@ansheng ~]# python scripts.py 
    # 正如我们看到的,会输出下面的内容
    lib/f1.py
    

    这是我们再创建一个scripts1.py文件

    [root@ansheng ~]# touch scripts1.py
    

    scripts1.py文件内容如下

    [root@ansheng ~]# cat scripts1.py 
    #!/usr/bin/env pyton
    import scripts
    

    文件创建好后执行他,我们会发现什么也没有输出

    [root@ansheng ~]# python scripts1.py
    

    然后我们把scripts.py脚本文件内容改为如下

    [root@ansheng ~]# cat scripts.py
    #!/usr/bin/env pyton
    from lib import f1
    f1.echo()
    

    再次执行scripts1.py脚本这是就会输出lib/f1.py

    [root@ansheng ~]# python scripts1.py 
    lib/f1.py
    

    为什么会出现上面的情况呢?

    因为原来的scripts.py文件加了if判断,其意思就是说如果__name__的值等于"__main__",那么我就执行f1.echo()方法,否则就什么也不做,当scripts.py文件被我们直接执行的时候的__name__返回结果是"__main__",如果被别的文件调用了,那么__name__返回的结果是"scripts"

    自动把当前目录下面的bin目录添加到python的PATH变量中

    目录结构及脚本内容如下

    [root@ansheng ~]# tree /tmp/
    /tmp/
    ├── bin
    │   ├── f1.py
    │   └── __init__.py
    └── scripts.py
    
    1 directory, 3 files
    [root@ansheng ~]# cat /tmp/scripts.py 
    #!/usr/bin/env pyton
    import os
    import sys
    
    path = os.path.dirname(__file__)
    mod_path = os.path.join(path,"bin")
    
    sys.path.append(mod_path)
    for n in sys.path:
        print(n)
    

    执行结果

    [root@ansheng ~]# python /tmp/scripts.py 
    /tmp
    /usr/lib64/python26.zip
    /usr/lib64/python2.6
    /usr/lib64/python2.6/plat-linux2
    /usr/lib64/python2.6/lib-tk
    /usr/lib64/python2.6/lib-old
    /usr/lib64/python2.6/lib-dynload
    /usr/lib64/python2.6/site-packages
    /usr/lib64/python2.6/site-packages/gtk-2.0
    /usr/lib/python2.6/site-packages
    /usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info
    /tmp/bin

    十二、Python3内置函数

       Built-in Functions   
    abs() dict() help() min() setattr() all() dir()
    hex() next() slice() any() divmod() id() object()
    sorted() ascii() enumerate() input() oct() staticmethod() bin()
    eval() int() open() str() bool() exec() isinstance()
    ord() sum() bytearray() filter() issubclass() pow() super()
    bytes() float() iter() print() tuple() callable() format()
    len() property() type() chr() frozenset() list() range()
    vars() classmethod() getattr() locals() repr() zip() compile()
    globals() map() reversed() __import__() complex() hasattr() max()
    round() delattr() hash() memoryview() set()    

    官方介绍:https://docs.python.org/3/library/functions.html

    内置函数详解

    abs(x)

    返回数字的绝对值,参数可以是整数或浮点数,如果参数是复数,则返回其大小。

    # 如果参数是复数,则返回其大小。
     >>> abs(-25)
    25
     >>> abs(25)
    25
    

    all(iterable)

    all()会循环括号内的每一个元素,如果括号内的所有元素都是真的,或者如果iterable为空,则返回True,如果有一个为假的那么就返回False

    >>> all([])
    True
    >>> all([1,2,3])
    True
    >>> all([1,2,""])
    False
    # 如果有一个为假,则都为假
    >>> all([1,2,None])
    False
    

    假的参数有:False0None""[](){}等,查看一个元素是否为假可以使用bool进行查看。

    any(iterable)

    循环元素,如果有一个元素为真,那么就返回True,否则就返回False

     >>> any([0,1])
    True
     >>> any([0])
    False
    

    ascii(object)

    在对象的类中寻找__repr__方法,获取返回值

     >>> class Foo:
     ...  def __repr_(self):
     ...     return "hello"
     ...
     >>> obj = Foo()
     >>> r = ascii(obj)
     >>> print(r)
    # 返回的是一个可迭代的对象
    <__main__.Foo object at 0x000001FDEE13D320>
    

    bin(x)

    将整数x转换为二进制字符串,如果x不为Python中int类型,x必须包含方法__index__()并且返回值为integer

    # 返回一个整数的二进制
     >>> bin(999)
    '0b1111100111'
    
    # 非整型的情况,必须包含__index__()方法切返回值为integer的类型
     >>> class myType:
     ...   def __index__(self):
     ...       return 35
     ...
     >>> myvar = myType()
     >>> bin(myvar)
    '0b100011'
    

    bool([x])

    查看一个元素的布尔值,非真即假

     >>> bool(0)
    False
     >>> bool(1)
    True
     >>> bool([1])
    True
     >>> bool([10])
    True
    

    bytearray([source [, encoding [, errors]]])

    返回一个byte数组,Bytearray类型是一个可变的序列,并且序列中的元素的取值范围为 [0 ,255]。

    source参数:

    1. 如果source为整数,则返回一个长度为source的初始化数组;
    2. 如果source为字符串,则按照指定的encoding将字符串转换为字节序列;
    3. 如果source为可迭代类型,则元素必须为[0 ,255]中的整数;
    4. 如果source为与buffer接口一致的对象,则此对象也可以被用于初始化bytearray.。
     >>> bytearray(3)
    bytearray(b'x00x00x00')
    

    bytes([source[, encoding[, errors]]])

     >>> bytes("asdasd",encoding="utf-8")
    b'asdasd'
    

    callable(object)

    返回一个对象是否可以被执行

     >>> def func():
     ...  return 123
     ...
     >>> callable(func)
    True
     >>> func = 123
     >>> callable(func)
    False
    

    chr(i)

    返回一个数字在ASCII编码中对应的字符,取值范围256个

     >>> chr(66)
    'B'
     >>> chr(5)
    'x05'
     >>> chr(55)
    '7'
     >>> chr(255)
    'xff'
     >>> chr(25)
    'x19'
     >>> chr(65)
    'A'
    

    classmethod(function)

    返回函数的类方法

    compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

    把字符串编译成python可执行的代码

     >>> str = "for i in range(0,10): print(i)"
     >>> c = compile(str,'','exec')
     >>> exec(c)
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    

    complex([real[, imag]])

    创建一个值为real + imag * j的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数

     >>> complex(1, 2)
    (1+2j)
    # 数字
     >>> complex(1)
    (1+0j)
    # 当做字符串处理
     >>> complex("1")
    (1+0j)
    # 注意:这个地方在“+”号两边不能有空格,也就是不能写成"1 + 2j",应该是"1+2j",否则会报错
     >>> complex("1+2j")
    (1+2j)
    

    delattr(object, name)

    删除对象的属性值

    >>> class cls:
    ...   @classmethod
    ...   def echo(self):
    ...     print('CLS')
    ... 
    >>> cls.echo()
    CLS
    >>> delattr(cls, 'echo')
    >>> cls.echo()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: type object 'cls' has no attribute 'echo'
    

    dict(**kwarg)

    创建一个数据类型为字典

     >>> dic = dict({"k1":"123","k2":"456"})
     >>> dic
    {'k1': '123', 'k2': '456'}
    

    dir([object])

    返回一个对象中中的所有方法

     >>> dir(str)
    ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
    

    divmod(a, b)

    返回的是a//b(除法取整)以及a对b的余数,返回结果类型为tuple

     >>> divmod(10, 3)
    (3, 1)
    

    enumerate(iterable, start=0)

    为元素生成下标

     >>> li = ["a","b","c"]
     >>> for n,k in enumerate(li):
     ...  print(n,k)
     ...
    0 a
    1 b
    2 c
    

    eval(expression, globals=None, locals=None)

    把一个字符串当作一个表达式去执行

     >>> string = "1 + 3"
     >>> string
    '1 + 3'
     >>> eval(string)
    4
    

    exec(object[, globals[, locals]])

    把字符串当作python代码执行

     >>> exec("for n in range(5): print(n)")
    0
    1
    2
    3
    4
    

    filter(function, iterable)

    筛选过滤,循环可迭代的对象,把迭代的对象当作函数的参数,如果符合条件就返回True,否则就返回False

     >>> def func(x):
     ...  if x == 11 or x == 22:
     ...    return True
     ...
     >>> ret = filter(func,[11,22,33,44])
     >>> for n in ret:
     ...  print(n)
     ...
    11
    22
    
    >>> list(filter((lambda x: x > 0),range(-5,5)))
    [1, 2, 3, 4]
    

    float([x])

    将整数和字符串转换成浮点数

     >>> float("124")
    124.0
     >>> float("123.45")
    123.45
     >>> float("-123.34")
    -123.34
    

    format(value[, format_spec])

    字符串格式化

    详键:https://blog.ansheng.me/article/python-full-stack-way-string-formatting/

    frozenset([iterable])

    frozenset是冻结的集合,它是不可变的,存在哈希值,好处是它可以作为字典的key,也可以作为其它集合的元素。缺点是一旦创建便不能更改,没有add,remove方法。

    getattr(object, name[, default])

    返回对象的命名属性的值,name必须是字符串,如果字符串是对象属性之一的名称,则结果是该属性的值。

    globals()

    获取或修改当前文件内的全局变量

    >>> a = "12"
    >>> bsd = "54asd"
    >>> globals()
    {'__doc__': None, 'a': '12', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, 'bsd': '54asd', '__builtins__': <module 'builtins' (built-in)>, 'n': '__doc__', '__name__': '__main__', '__spec__': None, '__package__': None}
    

    hasattr(object, name)

    参数是一个对象和一个字符串,如果字符串是对象的某个属性的名称,则结果为True,否则为False。

    hash(object)

    返回一个对象的hash值

     >>> a = "asdadasdwqeq234sdfdf"
     >>> hash(a)
    5390438057823015497
    

    help([object])

    查看一个类的所有详细方法,或者查看某个方法的使用详细信息

     >>> help(list)
    Help on class list in module __builtin__:
    
    class list(object)
     |  list() -> new empty list
     |  list(iterable) -> new list initialized from iterable's items
     |  
     |  Methods defined here:
     |  
     |  __add__(...)
     |      x.__add__(y) <==> x+y
     |  
     |  __contains__(...)
     |      x.__contains__(y) <==> y in x
     |  
     |  __delitem__(...)
     |      x.__delitem__(y) <==> del x[y]
     |  
     |  __delslice__(...)
     |      x.__delslice__(i, j) <==> del x[i:j]
     |      
     |      Use of negative indices is not supported.
    ..........

    hex(x)

    获取一个数的十六进制

     >>> hex(13)
    '0xd'
    

    id(object)

    返回一个对象的内存地址

     >>> a = 123
     >>> id(a)
    1835400816
    

    input([prompt])

    交互式输入

     >>> name = input("Pless your name: ")
    Pless your name: ansheng
     >>> print(name)
    ansheng
    

    int(x, base=10)

    获取一个数的十进制

     >>> int("31")
    31
    

    也可以作为进制转换

     >>> int(10)
    10
     >>> int('0b11',base=2)
    3
     >>> int('11',base=8)
    9
     >>> int('0xe',base=16)
    14
    

    isinstance(object, classinfo)

    判断对象是否是这个类创建的

    >>> li = [11,22,33]
    >>> isinstance(li,list)
    True
    

    issubclass(class, classinfo)

    查看一个对象是否为子类

    iter(object[, sentinel])

    创建一个可迭代的对象

     >>> obj = iter([11,22,33,44])
     >>> obj
    <list_iterator object at 0x000002477DB25198>
     >>> for n in obj:
     ...  print(n)
     ...
    11
    22
    33
    44
    

    len(s)

    查看一个对象的长度

     >>> url="ansheng.me"
     >>> len(url)
    10
    

    list([iterable])

    创建一个数据类型为列表

     >>> li = list([11,22,33,44])
     >>> li
    [11, 22, 33, 44]
    

    locals()

    返回当前作用域的局部变量,以字典形式输出

     >>> func()
     >>> def func():
     ...  name="ansheng"
     ...  print(locals())
     ...
     >>> func()
    {'name': 'ansheng'}
    

    map(function, iterable, …)

    对一个序列中的每一个元素都传到函数中执行并返回

    >>> list(map((lambda x : x +10),[1,2,3,4]))
    [11, 12, 13, 14]
    

    max(iterable, *[, key, default])

    max(arg1, arg2, *args[, key])

    取一个对象中的最大值

     >>> li = list([11,22,33,44])
     >>> li = [11,22,33,44]
     >>> max(li)
    44
    

    memoryview(obj)

    返回对象obj的内存查看对象

     >>> import struct
     >>> buf = struct.pack("i"*12, *list(range(12)))
     >>> x = memoryview(buf)
     >>> y = x.cast('i', shape=[2,2,3])
     >>> print(y.tolist())
    [[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]
    

    min(iterable, *[, key, default])

    min(arg1, arg2, *args[, key])

    取一个对象中的最小值

     >>> li = list([11,22,33,44])
     >>> li = [11,22,33,44]
     >>> min(li)
    11
    

    next(iterator[, default])

    每次只拿取可迭代对象的一个元素

     >>> obj = iter([11,22,33,44])
     >>> next(obj)
    11
     >>> next(obj)
    22
     >>> next(obj)
    33
     >>> next(obj)
    44
     >>> next(obj)
     # 如果没有可迭代的元素了就会报错
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    

    object

    返回一个新的无特征对象

    oct(x)

    获取一个字符串的八进制

     >>> oct(13)
    '0o15'
    

    open(file, mode=’r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

    文件操作的函数,用来做文件操作的

     # 打开一个文件
    - >>> f = open("a.txt","r")
    

    ord(c)

    把一个字母转换为ASCII对对应表中的数字

     >>> ord("a")
    97
     >>> ord("t")
    116
    

    pow(x, y[, z])

    返回一个数的N次方

     >>> pow(2, 10)
    1024
     >>> pow(2, 20)
    1048576
    

    print(*objects, sep=’ ‘, end=’ ’, file=sys.stdout, flush=False)

    打印输出

     >>> print("hello word")
    hello word
    

    property(fget=None, fset=None, fdel=None, doc=None)

    range(start, stop[, step])

    生成一个序列

     >>> range(10)
    range(0, 10)
     >>> for n in range(5):
     ...  print(n)
     ...
    0
    1
    2
    3
    4
    

    repr(object)

    返回一个包含对象的可打印表示的字符串

    >>> repr(111)
    '111'
    >>> repr(111.11)
    '111.11'
    

    reversed(seq)

    对一个对象的元素进行反转

     >>> li = [1, 2, 3, 4]
     >>> reversed(li)
    <list_reverseiterator object at 0x000002CF0EF6A940>
     >>> for n in reversed(li):
     ...  print(n)
     ...
    4
    3
    2
    1
    

    round(number[, ndigits])

    四舍五入

     >>> round(3.3)
    3
     >>> round(3.7)
    4
    

    set([iterable])

    创建一个数据类型为集合

     >>> varss = set([11,222,333])
     >>> type(varss)
    <class 'set'>

    setattr(object, name, value)

    为某个对象设置一个属性

    slice(start, stop[, step])

    元素的切片操作都是调用的这个方法

    sorted(iterable[, key][, reverse])

    为一个对象的元素进行排序

    代码:

    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    
    char=['赵',"123", "1", "25", "65","679999999999", "a","B","alex","c" ,"A", "_", "ᒲ",'a钱','孙','李',"余", '佘',"佗", "㽙", "铱", "钲钲㽙㽙㽙"]
    
    new_chat = sorted(char)
    print(new_chat)
    for i in new_chat:
        print(bytes(i, encoding='utf-8'))
    

    输出结果:

    C:Python35python.exe F:/Python_code/Note/soretd.py
    ['1', '123', '25', '65', '679999999999', 'A', 'B', '_', 'a', 'alex', 'a钱', 'c', 'ᒲ', '㽙', '佗', '佘', '余', '孙', '李', '赵', '钲钲㽙㽙㽙', '铱']
    b'1'
    b'123'
    b'25'
    b'65'
    b'679999999999'
    b'A'
    b'B'
    b'_'
    b'a'
    b'alex'
    b'axe9x92xb1'
    b'c'
    b'xe1x92xb2'
    b'xe3xbdx99'
    b'xe4xbdx97'
    b'xe4xbdx98'
    b'xe4xbdx99'
    b'xe5xadx99'
    b'xe6x9dx8e'
    b'xe8xb5xb5'
    b'xe9x92xb2xe9x92xb2xe3xbdx99xe3xbdx99xe3xbdx99'
    b'xe9x93xb1'
    
    Process finished with exit code 0
    

    staticmethod(function)

    返回函数的静态方法

    str(object=b’’, encoding=’utf-8’, errors=’strict’)

    字符串

     >>> a = str(111)
     >>> type(a)
    <class 'str'>

    sum(iterable[, start])

    求和

     >>> sum([11,22,33])
    66
    

    super([type[, object-or-type]])

    执行父类的构造方法

    tuple([iterable])

    创建一个对象,数据类型为元组

    >>> tup = tuple([11,22,33,44])
    >>> type(tup)
    <class 'tuple'>

    type(object)

    查看一个对象的数据类型

     >>> a = 1
     >>> type(a)
    <class 'int'>
     >>> a = "str"
     >>> type(a)
    <class 'str'>

    vars([object])

    查看一个对象里面有多少个变量

    zip(*iterables)

    将两个元素相同的序列转换为字典

    >>> li1 = ["k1","k2","k3"]
    >>> li2 = ["a","b","c"]
    >>> d = dict(zip(li1,li2))
    >>> d
    {'k1': 'a', 'k2': 'b', 'k3': 'c'}
    

    __import__(name, globals=None, locals=None, fromlist=(), level=0)

    导入模块,把导入的模块作为一个别名

    生成随机验证码例子

    生成一个六位的随机验证码,且包含数字,数字的位置随机

    # 导入random模块
    import random
    temp = ""
    for i in range(6):
        num = random.randrange(0,4)
        if num == 3 or num == 1:
            rad2 = random.randrange(0,10)
            temp = temp + str(rad2)
        else:
            rad1 = random.randrange(65,91)
            c1 = chr(rad1)
            temp = temp + c1
    print(temp)
    

    输出结果

    72TD11
     
  • 相关阅读:
    [Linked List]Convert Sorted List to Binary Search Tree
    [Linked List]Reorder List
    [Linked List]Insertion Sort List
    解剖Nginx·模块开发篇(4)模块开发中的命名规则和模块加载与运行流程
    解剖Nginx·模块开发篇(3)ngx_http_hello_world_module 模块的基本函数实现
    解剖Nginx·模块开发篇(2)ngx_http_hello_world_module 模块基本结构定义
    解剖Nginx·模块开发篇(1)跑起你的 Hello World 模块!
    Nginx 源码完全注释(11)ngx_spinlock
    Nginx 源码完全注释(10)ngx_radix_tree
    Nginx源码完全注释(9)nginx.c: ngx_get_options
  • 原文地址:https://www.cnblogs.com/defifind/p/7749928.html
Copyright © 2020-2023  润新知