美文网首页
Python基础2

Python基础2

作者: 这货不是王马勺 | 来源:发表于2022-11-18 17:56 被阅读0次

    模块

    又可称为库。python强大的地方在于他有非常丰富和强大的标准库和第三方库。
    以两个sys模块和os模块为例,先看sys:

    import sys
    print(sys.path)
    print(sys.argv)
    print(sys.argv[2])
    

    其中“sys.path”这种格式就是指“模块.方法”,文件起名字一定不能导入模块的名字相同。
    sys.path是python内部环境变量,使用的模块会在打印结果中寻找,第三方库一般存在lib\site-package里面。
    argv显示当前相对路径,
    argv[2]表示输出刚刚输入的第二个值(使用python命令行界面,输入python sys1.py a b c,结果会单独显示一个b,输入的第二个值就是列表中第3个值)

    os模块:

    import os
    
    os.system("dir")
    

    dir在windows上的输出结果会打在屏幕上,执行结果成功实则为0,不能保存结果到变量。

    import os
    
    cmd_res = os.popen("dir").read()
    print("---->",cmd_res)
    
    os.mkdir("new_dir")
    

    使用popen能将结果存在内存中,如果不加read(),赋给变量的只是一个内存地址,加了read才是我们需要的值。
    os.mkdir则是在当前目录新建子目录。

    也可以调用自建模块,如我在同目录下有一个login.py的文件,可以直接import login来调用。
    如果放在不同目录下的话,需要保证放在环境变量目录中,如size-package下,或者修改环境变量增加一个存放目录。

    当我们调用的时候会产生一个.pyc文件(3版本会放在__pycache__目录下),当程序运行时,编译的结果保存在内存中国的PyCodeObject中,当程序运行结束时,Python解释器则将PyCodeObject写回到.pyc文件中。当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到(且pyc比源代码更新时间晚),则直接载入,否则重复上面的过程。
    因此pyc文件其实就是PyCodeObject的一种持久化保存方式。
    注意编译的结果不是机器码,还差的很多,只是一个二进制文件。

    数据类型

    数字
    int(整型)
    64位系统上,整数位数为64位,取值范围是-263~(263-1),在python中取多少次幂用双*表示,如2**32

    long(长整型)
    python2的长整数没有指定位宽,最大与内存相关,python3中没有长整型,无论存多大都是int。

    float(浮点型)
    表示形式是小数,类似于C语言中的double类型。

    complex(复数)
    基本用不到。

    布尔值
    只有两个值,真或假,对应1或0。

    字符串

    bytes类型
    字节类型和字符串是两回事,字符串使用encode编码,二进制使用decode解码,python中不指定编码格式的话会使用utf-8:

    msg='niubi'
    print(msg)
    print(msg.encode())
    print(msg.encode(encoding="utf-8"))
    print(msg.encode(encoding="utf-8").decode(encoding="utf-8"))
    

    列表

    列表也是一种类型,单独拿出来说一下。
    声明方式就是中括号[]:

    names = ["wangwenjie","wangxuanzhen","wangyixiao","xialunhao"]
    print(names)
    

    取列表的值:

    print(names[0])
    print(names[0],names[2])
    print(names[1:3])  #取连续值,也叫切片,是左闭右开的
    print(names[-1])  #取最后一个值
    print(names[-2])  #取倒数第二个值
    print(names[-3:-1])  #注意都是从左往右取
    print(names[-3:])  #冒号后面不写东西表示取到最后一个值
    print(names[:3])  #同print(names[0:3])
    

    使用append或insert方法来追加值:

    names = ["wangwenjie","wangxuanzhen","wangyixiao","xialunhao"]
    names.append("xiejiacheng") #在最后插入
    names.insert(4,"xiayunchao") #在指定位置插入
    print(names)
    

    不能批量插入,只能一个一个来。

    直接修改值:

    names[1] = "zhangfuyong"
    

    删除值的方法:

    names.remove("zhangfuyong")
    del names[1] 
    names.pop()       
    names.pop(1) 
    

    pop()方法不加数字的话会删掉最后一个值。

    其他:

    print(names.index("wangyixiao"))  #找位置
    print(names[names.index("wangyixiao")])  #找到位置后取出
    print(names.count("zhangfuyong")) #计数
    names.clear() #清空列表
    names.reverse() #反转列表元素的顺序
    names.sort() #排序,特殊符号、数字、大写字母、小写字母,就是按ascII码里的顺序来的
    
    names2 = [1,2,3,4]
    names.extend(names2)  #合并另一个列表的元素,不会破坏该列表
    print(names,names2)
    
    del names2  #删除列表变量
    
    name2 = names.copy #复制
    print(name2)
    
    names[1] = "zhangfuyong"
    print(name2)  #发现在copy过后,修改原表不会使copy表发生变化
    

    列表中还可以包含子列表:

    names = ["yi","er","san",["si","wu"],"liu"]
    name2 = names.copy()
    print(names)
    print(name2)
    
    name[2] = "SAN"
    names[3][0] = "SI"
    print(names)
    print(name2)  
    #会发现虽然san没改,但si改成SI了,因为copy仅copy第一层,是由内存中存储方式决定的
    names = ["yi","er","san",["si","wu"],"liu"]
    name3 = names
    name[2] = "SAN"
    names[3][0] = "SI"
    print(names)
    print(name3)
    #会发现全都跟着改了
    

    可以看出,将一个列表变量赋给另一个变量,与将字符串或数字赋给一个变量有所不同,列表会跟着变。

    如果我们想真正的不受干扰的复制一个列表,我们需要copy模块的深copy,否则copy.copy()仍然是浅copy:

    import copy
    names = ["yi","er","san",["si","wu"],"liu"]
    name2 = copy.deepcopy(names)
    

    浅copy的几种方式:

    person=['name',['a',100]]
    
    p1=copy.copy(person)
    p2=person[:]
    p3=list(person)
    

    列表循环:

    names = ["yi","er","san",["si","wu"],"liu"]
    for i in names:
      print(i)
    

    列表跳跃切片,以从头到尾每隔一个一输出为例:

    names = ["yi","er","san",["si","wu"],"liu"]
    print(names[0:-1:2])
    print(names[::2])
    

    0和-1是可以省略的

    元组类型
    元组tuple又称为只读列表,用小括号声明,一旦定义了便不能修改,其只有两个方法,一个是count,一个是index

    names = ('a','b')
    

    列表应用示例

    product_list = [
      ('iphone',5800),
      ('macbook',9900),
      ('bike',800),
      ('watch',10600),
      ('coffee',31)
    ]
    shopping_list = []
    
    salary = input("input your salary:")
    if salary.isdigit():
      salary = int(salary)
      while True:
        for item in product_list:
          print(product_list.index(item),item)
    #  break
    #    for index,item in enumerate(product_list):
    #      print(index,item)
    #    break
        user_choice = input("选择要购买的商品编号>>>:")
        if user_choice.isdigit():
          user_choice = int(user_choice)
          if user_choice < len(product_list) and user_choice >= 0:
            p_item = product_list[user_choice]
            if p_item[1] <= salary: #买得起
              shopping_list.append(p_item)
              salary -= p_item[1]
              print("added %s into shopping cart, your current balance is \033[31;1m%s\033[0m" %(p_item,salary))
            else:
              print("\033[41;1m你的余额只剩[%s]了\033[0m"%salary)
          else:
            print("product code [%s] is not exist"%user_choice)
        elif user_choice == 'q':
          print("-----shopping list-----")
          for p in shopping_list:
            print(p)
          print("your current balance is :",salary)
          exit()
        else:
          print("invalid option")
    else:
      print("invalid salary")
    

    其中salary.isdigit()判断是否为数字形式,字符串中的数字也属于数字形式。
    \033[31;1m和\033[0m括起来的部分是给文字加颜色,不同的颜色请参考:

    https://blog.csdn.net/qq_37952052/article/details/124110713
    

    字符串

    重点说一下字符串
    首字母大写:

    name = 'messi'
    print(name.capitalize())
    

    相关文章

      网友评论

          本文标题:Python基础2

          本文链接:https://www.haomeiwen.com/subject/uejyxdtx.html