python第一阶段:基础部分注意点

1.格式化输出中的f-string,亦称为格式化字符串常量:f'{}'

for i in li:
  if type(i) == str:
    print(f'"{i.lower()}"') # 这里的双引号是为了输出的是字符串,不加也行

2.运算符

执行顺序:() => not => and => or
x or y:
  当x是非零,返回x
  当x是零,返回y
and和or相反

3.字典

新增方式:
dic = {'k1':'v1','k2':'v2'}
dic.setdefault('k3', 'v3') #如果在字典中存在这个key,就不进行任何操作,不存在就进行添加
#####################################################################################################################
更新方式:
dic1 = {'key':'value','name1':'dic1_value1','qqq':'111'}
dic2 = {'火女':'安妮','火男':'布兰德','qqq':'222'}
dic1.update(dic2) # 将dic2更新到dic1,如果两个字典中有相同的key时,dic2的k-v键值对会覆盖dic1的k-v键值对
print(dic1) new_dic
= dict(**dic1, **dic2) # 将dic1和dic2合并为一个新的字典。如果两个字典中有相同的key时会报错。
print(new_dic)
####################################################################################################################
查看方式:
print(dic.get('k3', '没有这个值')) #没有这个value返回None,可以指定返回的内容
####################################################################################################################
解构(解包):
a, b = '12'  # 将后边解构打开按位置赋值给变量。支持:字符串、列表、元组
print(a)
print(b)
###################################################################################################################
删除(循环删除要注意。列表和字典都不能在循环的时候进行删除. 字典在循环的时候不允许改变大小)
dic = {'提莫':'冯提莫', '发姐':'陈一发儿', '55开':'卢本伟'}
lst = []
for k in dic:
    lst.append(k)

for el in lst:
    dic.pop(el)
print(dic)

4.小数据池

数字小数据池的范围  -5 ~ 256
字符串中如果有特殊字符他们的内存地址就不一样
字符串中单个*20以内他们的内存地址一样,单个*21以上内存地址不一致

5.zip函数(个人感觉主要是对列表的处理)

a = [[11, 22, 33], [44, 55, 66]]
b = [[77, 88, 99], [88, 99, 10]]

f = zip(*a, *b)
lst = list(f)
print(lst)
for i in lst:
    print(i) # 打印的是元组

6.深浅拷贝

书读百遍其义自见。今天再看深浅拷贝,灵光一闪。彻底懂了这玩意。
之所以存在深浅拷贝,最主要的就是共享内存这4个字。拷贝:原则上就是把数据分离出来,复制其数据,并以后修改互不影响。
https://www.cnblogs.com/feifeifeisir/p/10426263.html,参考这个博主写的

 7.函数参数存放顺序

顺序:位置参数, *args, 默认值参数, **kwargs
形参的位置*,**: 聚合
实参的位置*,**: 打散
def chi(name, *food, location="北京", **kwargs):  # 参数名是food、kwargs:*表示位置参数动态传参 **表示关键字参数动态传参
    print(location)
    print(name + "要吃", food, '。这个的关键字动态参数', kwargs)

lst = ["狗不理", "大麻花", "天津"]
other = {'k1': 'v1', 'k2': 'v2'}
chi("小伙", *lst, **other) # 这里加*号和不加可以分别看一下效果
chi("小伙", *lst, good_food="狗不理", no_good_food="汉堡", drink="大白梨", ice_cream="巧乐兹")

 8.闭包

闭包:在内层函数中访问外层函数的局部变量
  好处:
    1. 保护你的变量不受外界影响
    2. 可以让变量常驻内存
  写法:
def outer():
    a = 10
    def inner():
        print(a)
    print(inner.__closure__)  # 如果打印的是None. 不是闭包. 如果不是None, 就是闭包
    return inner

9.迭代器、生成器、装饰器

迭代器和生成器参考
https://www.cnblogs.com/muyuyingfeng/p/11040872.html
迭代器:
使用dir来查看该数据包含了哪些方法 用来遍历列表,字符串,元祖....这些可迭代对象 可迭代对象(Iterable):里面有__iter__()可以获取迭代器, 没有__next__() 迭代器(Iterator):里面有__iter__()可以获取迭代器, 还有__next__() 迭代器特点:
1. 只能向前. 2. 惰性机制. 3. 节省内存.(生成器)
###############################################################################################################
生成器:
之所以要用生成器,就是为了解决大数据存储的占用内存的问题(数学界的各种穷举)。是一个特殊的迭代器,个人理解成一个手写的迭代器。
特点:只能向前,惰性机制,节省内存
生成器函数:如果一个函数有 yield 关键字,那么这个函数的返回值就是一个生成器
生成器推导式:gen = (x for x in range(5)),此时的gen就是一个生成器
使用for循环调用:
for item in gen:
    print(item)
使用next或者send调用:send不能用在开头或者结尾
print(next(gen)
###################################################################################################################
装饰器参考
https://www.cnblogs.com/arvin-feng/p/11108799.html
https://www.cnblogs.com/muyuyingfeng/p/11039986.html

10.内置函数

lambda sorted() filter() map()

11.模块部分常用的多写写

12.oop部分

面向对象3大特性:封装、继承、多态
1.封装:
  A.将相关功能封装到一个类中
  B.将数据封装到一个对象中
2.继承:
这里要注意一下super关键字。
写法:super(子类, self).func
使用的是C3算法。具体可以参考这篇博客 https://www.cnblogs.com/shengulong/p/7892266.html
C3算法简单描述就是:从下往上找,从左往右找,从入度为0的开始找,最终返回的是一个列表
3.多态:鸭子模型
4.反射相关的4个:
getattr # 根据字符串的形式,去对象中找成员。
hasattr # 根据字符串的形式,去判断对象中是否有成员。
setattr # 根据字符串的形式,动态的设置一个成员(内存)
delattr # 根据字符串的形式,动态的删除一个成员(内存)

13.网络编程部分:黏包、断点续传、tcp三次握手四次挥手、socket源码理解

14.多线程:GIL锁、线程安全、计算密集型使用多进程,IO密集型使用多线程、生产消费者模型

原文地址:https://www.cnblogs.com/wangyadong/p/12734921.html