• python知识点汇总


    一 变量类型

    1.0 注释

    # 单行注释

    '''多行注释'''

    """多行注释"""

    1.1 字符串

    字典和字符串

    字符串转字典:str1 = "{'key':1,'value':2}"eval()

    01 内置函数eval()  实现str 和list tuple dict相互转化

    # eval() 内置函数  str 和 list  tuple dict相互转化
    data = "{'key1':'a','key2':2}"
    str2dict = eval(data)
    print("str2dict:   ",str2dict)  # {'key1': 'a', 'key2': 2}
    print("str2dict数据类型是:  ",type(str2dict))  # <class 'dict'>

    02 json.dumps()和json.loads()对简单的数据类型进行编解码

    json编码中:python原始类型到json类型的转化对照表

    image

    # json.dumps() dict编码为json
    dictD = {'key1': 'a', 'key2': 2}  --》{"key1": "a", "key2": 2}
    dict2json = json.dumps(dictD)
    print("dict2json:   ",dict2json)  # {"key1": "a", "key2": 2}
    print("dict2json数据类型是:   ",type(dict2json))  # <class 'str'>

    json解码中:json类型到python原始类型转化对照表

    image

    data2 = '{"key1":"c","key2":4}'# 里边只能是双引号,单引号会报错,如'{'a':1}'
    json2dict = json.loads(data2)
    print("json2dict:   ",json2dict)
    print("json2dict数据类型是:   ",type(json2dict))
    
    str='{'a':1}' 想转化成json格式,需要先转成dict
    '{'a':1}'--》{'a':1}-->{"a":1}
    
    {'a':1} = eval('{'a':1}')
    
    {"a":1} = json.dumps({'a':1})

    1.2 列表  list

    列表的索引   取头不取尾

    lst = ['a','b',1,0]

    lst.append('c')     ['a','b',1,0.'c']

    lst.pop(0)   ['b',1,0,'c']

    lst[0]-->a;   lst[1:3]---> b ,1 ;   lst[:3] ---> a,b,1;   lst[1:] --> b, 1, 0;   lst[:] ---> a,b,1,0

    lst[-1]-->0;  lst[-3:-1] --->b,1 ;   lst[:-1] --> a,b,1  ;   lst[-2:] ---> 1,0

    lst[1:-1]-->b,  lst[-4:2]---> a,b

    列表遍历

    # 普通迭代
    for i in lst:
        print(i)
    # 带索引的迭代
    for index,value in enumerate(lst):
        print("index: ",index,"value: ",value)
    
    # 拓展场景(1)多列表迭代
    # 	01 循环嵌套  缺点:代码复杂度高
    xl,yl,zl = ['a'],['b'],['c']
    for x in xl:
        for y in yl:
            for z in zl:
                print(z)
            print(y)
        print(x)
    
    # 	02 intertools 标准库  缺点:不方便调试
    from itertools import product
    for x,y,z in product(xl,yl,zl):
        print(x,y,z)
    
    # 拓展场景(2)交集、并集、补集
    a=[2,3,4,5]
    b=[2,5,8]
    # 交集
    ls1 = list(set(a).intersection(set(b)))
    print("交集:",ls1)
    # 并集
    ls2 = list(set(a).union(set(b)))
    print("并集:",ls2)
    # 差集
    ls3 = list(set(b).difference(set(a))) # b中有而a中没有的
    ls4 = list(set(a).difference(set(b))) # a中有而b中没有的
    print("以b为底,a的补集:",ls3)
    print("以a为底,b的补集:",ls4)    
    
    交集: [2, 5]
    并集: [2, 3, 4, 5, 8]
    以b为底,a的补集: [8]
    以a为底,b的补集: [3, 4]
    

     1.3 元组 tuple

    一旦创建,不可修改,但是两个元组之间可以合并

    t1 = (1, 2, 3)
    t2 = (4, 5, 6)
    print(t1+t2) # (1, 2, 3, 4, 5, 6)

    注:元组和列表区别

    列表是动态数组,内容和长度可变

    元组是静态数组,内容和长度都不可变

    元组缓存于Python运行时环境,这意味着我们每次使用元组时无须访问内核去分配内存。

    1.4 字典 dict

    取值

    personinfo = {'name': 'joe', 'age':'20', 'hobby':'football'}
    print(personinfo['name'])  # joe

    遍历迭代

    personinfo = {'name': 'joe', 'age':'20', 'hobby':'football'}
    print(personinfo['name'])
    print(personinfo.items())  # dict_items([('name', 'joe'), ('age', '20'), ('hobby', 'football')])
    for k,v in personinfo.items():
        print(k,v)
    # 结果    
    name joe
    age 20
    hobby football

    使用场景 

    dict1 = {'a': 10, 'b': 8}
    dict2 = {'d': 6, 'c': 4}
    #合并/复制
    dictMerge = {**dict1,**dict2}
    print(dictMerge)
    #增添字段
    dict1 = {**dict1,'A':20}
    dict2.update({'D':3})
    print(("添加字段后 dict1是:%s  dict2是:%s") % (dict1,dict2))
    # 重写字段的值
    dict1 = {**dict1,'a':100}
    print(dict1)
    
    合并:{'a': 10, 'b': 8, 'd': 6, 'c': 4}
    添加字段后 dict1是:{'a': 10, 'b': 8, 'A': 20}  dict2是:{'d': 6, 'c': 4, 'D': 3}
    更改a的值为100: {'a': 100, 'b': 8, 'A': 20}
    
    实用场景2: dict和json相互转换
    import json
    dict5 = {'a':1,'key':'v'}
    dict2json = json.dumps(dict5)
    json2dict = json.loads(dict2json)
    print("dict2json值是: ",dict2json) # dict2json值是:  {"a": 1, "key": "v"}
    print("json2dict值是: ",json2dict) # json2dict值是:  {'a': 1, 'key': 'v'}

    1.5 拓展

    isinstance: 用来判断对象的类型,也可以判断一个对象是否是一个类的实例

    # 【常用场景1】:判断对象的类型
    py_int = 1
    py_str = 'a'
    py_list = ['a','b']
    py_dict = {'a':1,'b':2}
    print(isinstance(py_int, int))
    
    # 【常用场景2】:一个对象是否是一个类的实例
    class C():
     pass
    cc = C()
    print(isinstance(cc, C))
    
    # 运行结果
    True
    True

    format: 用于组长和格式化数据

    # 字符串
    str1 = "{} {}".format("hello","world")  # 不指定位置
    str2 = "{1} {0}".format("hello","world")  # 指定位置
    print(str1,"\n",str2)
    # 列表
    my_list = ['菜鸟教程', 'www.runoob.com']
    print("网站名:{0}, 地址 {1}".format(my_list[0],my_list[1]))
    print("网站名:{0[0]}, 地址 {0[1]}".format(my_list))  # "0" 是必须的
    
    # 字典
    site = {"name": "菜鸟教程", "url": "www.runoob.com"}
    print("网站名:{0}, 地址 {1}".format(site['name'],site['url']))
    print("网站名:{name}, 地址 {url}".format(**site))
    
    #运行结果
    hello world 
     world hello
    网站名:菜鸟教程, 地址 www.runoob.com
    网站名:菜鸟教程, 地址 www.runoob.com
    网站名:菜鸟教程, 地址 www.runoob.com
    网站名:菜鸟教程, 地址 www.runoob.com
    

    二 语句 方法 类

    2.1 条件语句

    2.2 循环语句

    while:

    for :

    for i in range():

    range(start=0,stop,step=1) start 默认为0,step步长默认为1,

    # step = 2
    for i in range(0,5,2):
        print("步长为2 ",i)
    
    # step = -2,
    for i in range(8,0,-2):
        print("步长为-2 ",i) # 8,6,4,2
    
    # 应用场景一:实现字符串倒序输出
    name = "abc"
    rename = ""
    for i in range(len(name)-1,-1,-1):
        print(name[i])
        rename += name[i]
    print(rename) # rename = "cba"

    2.3 方法

    2.4 类

    # 创建类
    class Employee
    	empCount = 0
      	
        def __init__(self,name,salary):
          self.name = name
          self.salary = salary
          Employee.empCount += 1
    
    	def displayInfo(self):
          print "name: ",self.name,"salary: ",self.salary, "empCount; ",self.empCount
          
    # __init__(),被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法      
    # self 代表类的实例,代表当前对象的地址,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
    # self.__class__ 则指向类。
    
    # 创建实例对象
    "创建 Employee 类的第一个对象"
    emp1 = Employee("Zara", 2000)
    "创建 Employee 类的第二个对象"
    emp2 = Employee("Manni", 5000)
    emp1.displayInfo()  # 访问属性
    empCounts = Employee.empCount
    
    # 可以添加,删除,修改类的属性
    emp1.age = 20
    print(emp1.age) # 20
    del emp1.age
    print(hasattr(emp1,'age')) # False
    
    hasattr(emp1, 'age')    # 如果存在 'age' 属性返回 True。
    getattr(emp1, 'age')    # 返回 'age' 属性的值
    setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8
    delattr(emp1, 'age')    # 删除属性 'age'

    单下划线、双下划线、头尾双下划线说明:

    • __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。

    • _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *

    • __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

    三 文件的读写和异常处理

    3.1 文件的读写

    file.truncate(size)  截取文件,截取的字节通过size指定,从首行开始截取,

    size不填写则,默认为当前文件位置。 

    f = open("main.py",'r+')
    print(f.name)
    # print(f.read(size))  size可有可无
    # print(f.readline(size))  size可有可无, 读取整行包括 \n
    print(f.readlines())  # ['\n', ' aaaaa']  每一行放入列表中
    f.write("\n aaaaa")  # 返回的是写入字符串的长度
    f.writelines()  # f.writelines(seq), seq必须是字符串列表["a \n","b"]如果需要换行则要自己加入每行的换行符。
    f.close()
    '''
    r 只读,文件指针在开头
    r+ 读写,文件指针在开头
    w 只写,文件指针在开头,如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    w+ 读写,文件指针在开头,如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    a 只写,追加内容。文件指针在结尾,如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+ 读写,文件指针在结尾,如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    '''
    
    with open("main.py","r") as f:
      print(f.readline())

    3.2 异常处理

    try:
        <statements>            # main action
    except <name1>:             # 当try中发生name1的异常时处理
        <statements> 
    except (name2, name3):      # 当try中发生name2或name3中的某一个异常的时候处理
        <statements>
    except <name4> as <data>:   # 当try中发生name4的异常时处理,并获取对应实例
        <statements>
    except:                     # 其他异常发生时处理
        <statements>
    else:                       # 没有异常发生时处理
        <statements>
    finally:                    # 不管有没有异常发生都会处理
        <statements>
    
    
    def main():
        try:
            number1, number2 = eval(input("分别输入两个数字(用逗号隔开):"))
            result = number1 / number2
            print("它们的商是:", result)
        except ZeroDivisionError:
            print("除以0,错误!")
        except SyntaxError:
            print("数字间未输入逗号!")
        except:
            print("输入出错了!")
        else:
            print("没有错误!")
        finally:
            print("已执行完!")
    
    main()

    四 进程和线程

    4.1 进程

    4.2 线程

    f"aaa{page}":https://blog.csdn.net/qq_35290785/article/details/90634344

    GIL

    生产者消费者爬虫

    多线程数据通信  queue.Queue()

    q.put()  q.get()会发生阻塞

    当队列满的时候put不进去,

    当队列空的时候,get不到元素

    线程安全:

    gil 也不能保证线程安全,https://zhuanlan.zhihu.com/p/311877485

    CPython 中还有另一个机制,叫做 check_interval,意思是 CPython 解释器会去轮询检查线程 GIL 的锁住情况。每隔一段时间,Python 解释器就会强制当前线程去释放 GIL,这样别的线程才能有执行的机会。

    关于github设置

    pycharm 集成git  github

    https://www.cnblogs.com/chenxiaomeng/p/14598391.html

    https://blog.csdn.net/weixin_44505553/article/details/108800876?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-3-108800876.pc_agg_new_rank&utm_term=%E6%97%A0%E6%B3%95%E5%B0%86git+%E8%AF%86%E5%88%AB%E4%B8%BAcmdlet&spm=1000.2123.3001.4430

    error:   Failed to connect to 127.0.0.1 port 1080 after 2078 ms: Connection refused

    https://blog.csdn.net/weixin_41010198/article/details/87929622

    参考资料: 

    https://mp.weixin.qq.com/s/vfxbNZcw6Uy4jFlI5VlmDA

    https://www.runoob.com/python3/python-merging-two-dictionaries.html

  • 相关阅读:
    PyCharm 的使用(二)
    redis数据库
    mysql大全
    Python 模块详解及import本质
    logging模块
    redis详细配置
    千万 PV,百万PV什么意思?
    elasticsearch集群添加节点
    elasticsearch集群安全重启节点
    记一次redis-cluster的切换
  • 原文地址:https://www.cnblogs.com/wsnan/p/15659408.html
Copyright © 2020-2023  润新知