Lyf凤

靡不有初,鲜克有终

扩大
缩小

Python全栈开发知识点总结

变量

# 概念: 把程序运行过程中产生的中间值保存在内存.方便后面使用.
# 命名规范:
1. 用数字.字母.下划线组成
2. 不能用数字开头. 更不能是纯数字
3. 不能使用python的关键字
4. 不要用中文
5. 不要太长   # 前端除外
6. 要有意义
7. 区分大小写
8. 推荐使用驼峰或者下划线
  每个单词的首字母大写(大驼峰,小驼峰是第一个单词的首字母小写,其余的首字母大写.)
  用下划线分隔每个单词

格式化输出

%s 字符串占位符(但是所有的数据类型都可以使用)
%d 数字占位符(只能int类型使用)
f"{变量}"
name = input("请输入你的名字:")
address = input("请输入你来自哪里:")
wife = input("请输入你的老婆:")
notlike = input("请输入你不喜欢的明星:")

# 需要掌握的内容===============
# 格式化输出  %s
print("我叫%s, 我来自%s, 我老婆是%s, 我不喜欢%s" % (name, address, wife, notlike))
# 新版本的格式化输出 f"{变量}" 
print(f"我叫{name}, 我来自{address}, 我老婆是{wife}, 我不喜欢{notlike}")
# 坑, 如果这句话使用了格式化输出. % 就是占位, 如果想显示正常的%   %% 转义
print("我叫%s, 我已经度过了30%的人生了" % "俞洪敏") # 报错 not enough arguments for format string
print("我叫%s, 我已经度过了30%%的人生了" % "俞洪敏")

 

注意:
  在字符串中如果使⽤了%s这样的占位符,那么所有的%都将变成占位符,我们需要使用%%来表示字符串中的%.

     如果你的字符串中没有使用过%s,%d占位.,那么不需要考虑这么多, 该%就%.没毛病老铁.

print("我叫%s, 今年22岁了, 学习python2%%了" % '王尼玛') # 有%占位符 
print("我叫王尼玛, 今年22岁, 已经凉了100%了") # 没有占位符

 

# 格式化输出  format
s12 = "我叫%s, 今年%d岁了, 我喜欢%s" % ('sylar', 18, '周杰伦') # 之前的写法 
print(s12)
s12 = "我叫{}, 今年{}岁了, 我喜欢{}".format("周杰伦", 28, "周润发") # 按位置格式化 
print(s12)
s12 = "我叫{0}, 今年{2}岁了, 我喜欢{1}".format("周杰伦", "周润发", 28) # 指定位置 
print(s12)
s12 = "我叫{name}, 今年{age}岁了, 我喜欢{singer}".format(name="周杰伦", singer="周润发", age=28) # 指定关键字
print(s12)

  

逻辑运算符

1,  优先级关系为   () > not > and > or 

2,  x or y , x为,值就是x,x为假,值是y;

    x and y,  x为真,值是y,  x为,值是x。 

#逻辑运算符 初级
'''
and : 并且. 左右两端同时为真. 结果才能是真
or : 或者. 左右两端有一个是真. 结果就是真
not : 非. 非真即假, 非假即真  不真-> 假  不假 -> 真
混合运算顺序: () => not => and => or  当出现相同的优先级的时候 从左往右算

'''
print(3 > 2 and 4 < 6 and 5 > 7) # False
print(5 < 6 or 7 > 8 or 9 < 6 or 3 > 2)  # True
print(not 5 < 6)  # False
print(3 > 2 or 5 < 7 and 6 > 8 or 7 < 5)  # True
print(3 > 4 or 4 < 3 and 1 == 1)  # False
print(1 < 2 and 3 < 4 or 1 > 2)  # True
print(2 > 1 and 3 < 4 or 4 > 5 and 2 < 1) # True
print(1 > 2 and 3 < 4 or 4 > 5 and 2 > 1 or 9 < 8) # False
print(1 > 1 and 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6) # False
print((not 2 > 1 and 3 < 4) or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6) # False


#逻辑运算符 进阶
'''
优先级依然是:() > not > and > or
当出现 x or y的时候, 判断x是否是0 如果x==0 then y 否则返回x
当出现 x and y 的时候, 和or相反(or 要非0,and要0)
把False 当成0,True 当成1来看
'''
# 当出现 x or y的时候, 判断x是否是0 如果x==0 then y 否则返回x
print(1 or 2) # 1
print(0 or 2) # 2
print(3 or 0) # 3
print(4 or 0) # 4
print(0 or 3 or 0 or 2 or 0 or 5 or 0 or 188)  # 3

# 当出现 x and y 的时候, 和or相反
print(1 and 2) # 2
print(0 and 3) # 0
print(3 and 0) # 0
print(4 and 0) # 0
print(9 and 3 and 4 and 1 and 4 and 8)  # 8
print(1 and 2 or 3) # 应付面试  2
print(1 and 2 > 4)  # False

# False 当成0来看
print(False and 1)  # False
print(3 > 5 or 5 < 6 and 7)  # 7
print(4 > 5 or 7 and 8 < 6 or 3 and 4)  # 4
print(4>5 or (7 and 8<6) or (3 and 4)) #优先级顺序依旧存在  4

 

编码 

# 初识编码   ascii ==> gbk ==> unicode ==> utf-8
    1. ascii   8bit  1byte(字节)  256个码位 只用到了7bit, 用到了前128个 最前面的一位是0
    2. 中国人自己对计算机编码进行统计. 自己设计. 对ascii进行扩展 ANSI 16bit -> 清华同方 -> gbk
        GBK 放的是中文编码. 16bit  2byte 兼容ascii
    3. 对所有编码进行统一. unicode. 万国码.  32bit. 4byte. 够用了但是很浪费
    4. utf-8 可变长度的unicode
        英文: 1byte
        欧洲文字: 2byte
        中文: 3byte

''' 
# 记住结论就好啦!
1. ascii   8bit   1byte  包含了 英文, 数字, 特殊字符, 特殊操作符
2. gbk     16bit  2byte 主要包含的: 中文, 日文, 韩文, 繁体中文
3. unicode 32bit  4byte 万国码
4. utf-8
    英文: 8bit 1byte
    欧洲: 16bit 2byte
    中文: 24bit 3byte
'''

小数据池 

小数据池只针対:整数(-5~256),字符串,布尓値.其他的数据类型不存在驻留机制

 

is和==

==判断左右两端的值是否相等 ==>住户
is判断左右两端内容的内存地址是否一致. ==>门牌号

 

 

动态传参

1.形参: 在函数声明的位置写的变量
1. 位置参数
2. 默认值参数
3. 动态传参
* 聚合. 接收位置参数的动态传参
** 聚合. 接收关键字参数的动态传参
形参的顺序:
位置 > *args > 默认值 > **kwargs

2.实参: 函数调用的地方写的具体的值
1. 位置参数
2. 关键字参数
3. 混合参数: 位置 > 关键字
* 把列表, 字符串, 元组打散成位置参数(实参传入多个列表的话,每个列表的前面都要加*)
** 把字典打散成关键字参数
def chi(*food):
    print("我要吃", food)  # 我要吃 ('⼤大⽶米饭', '⼩小⽶米饭')
    print(type(food))  # <class 'tuple'>

chi("⼤大⽶米饭", "⼩小⽶米饭")  #多个参数传递进去. 收到的内容是元组tuple
chi(*["⼤大⽶米饭", "⼩小⽶米饭"])  # *[列表] ==>打散成位置参数,等效于上面的调用



def he(**drink):
    print("我要喝", drink)  # 我要喝 {'a': '⼤大⽶米饭', 'b': '⼩小⽶米饭'}
    print(type(drink))  # <class 'dict'>

he(a="⼤大⽶米饭", b="⼩小⽶米饭")  #多个参数传递进去. 收到的内容是字典dict
he(**{"a":"⼤大⽶米饭", "b":"⼩小⽶米饭"})  # **[字典] ==>打散成关键字参数,等效于上面的调用



def func(*args, **kwargs): print(args, kwargs) func("麻花藤" ,"马晕" ,wtf="胡辣汤") # ('麻花藤', '马晕') {'wtf': '胡辣汤'}

 

闭包 迭代器

闭包 -> 函数的嵌套
   内层函数对外层函数(非全局)中的变量的使用

   好处:
       1. 保护变量不被侵害(#函数内部的变量都可以,因为在函数外部是无法调用函数内部的)
       2. 让一个变量常驻内存(#变量被使用就不会被垃圾回收机制回收)

   如何通过代码查看一个闭包
   函数名.__closure__: 有东西就是闭包. 没东西就不是闭包

迭代器 -> 固定的思路. for循环
   一个数据类型中包含了__iter__函数表示这个数据是可迭代的
   dir(数据): 返回这个数据可以执行的所有操作

   判断迭代器和可迭代对象的方案(野路子)
   __iter__            可迭代的(# dir(对象)包含__iter__ )
   __iter__  __next__  迭代器(# dir(对象)包含__iter__和 __next__)

   判断迭代器和可迭代对象的方案(官方)
   from collections import Iterable, Iterator
   isinstance(对象, Iterable) 是否是可迭代的
   isinstance(对象, Iterator) 是否是迭代器

   △使用while循环+迭代器来模拟for循环(#必须掌握):
   lst= ['a','b','c']
   # 拿迭代器
   it = lst.__iter__() # 获取到迭代器
   while 1:# 循环
       try:# 尝试
           print(it.__next__()) # 拿数据
       except StopIteration:# 出了错误, 意味着数据拿完了
           break# 结束循环

   迭代器特征:
       1. 省内存(生成器)
       2. 惰性机制
       3. 只能向前. 不能后退

   作用:统一了各种数据类型的遍历

生成器

# 各种推导式
列表推导式  [结果 for循环 for循环 if]  # 注意:多个for循环嵌套的话是按照正常写代码的for循环的顺序,前面的就是写在外层的for循环
字典推导式 {结果(k:v) for循环 if}
集合推导式 {结果(k) for循环 if}
生成器表达式 (结果 for循环 if)
​
生成器(函数)的特点:
  节省内存:生成器本身就是代码,几乎不占用内存
  惰性机制:没人要值就不会执行去拿值(# 要值的方式:gen.__next__(),gen.send('传值'),for i in gen,list(gen))
  只能向前,不能反复
# 生成器经典题
def add(a, b): # 相加
    return a + b

def test(): # 生成器函数 0  1   2  3
    for i in range(4):
        yield i

g = test()  # 创建生成器

for n in [2, 10]:
    g = (add(n, i) for i in g)

print(list(g))
# 结果:[20,21,22,23]
# 解题思路:惰性机制(#有人要值才执行);生成器记录的是代码(#只有在执行的时候才会带入变量的值)
# 1,拆分for循环
n = 2
g = (add(n, i) for i in g)
n = 10
g = (add(n, i) for i in g)
# 2,将g = test()代入,并层层带入
n = 2
g = (add(n, i) for i in test())
n = 10
g = (add(n, i) for i in (add(n, i) for i in test()))
# 3,拿值的时候带入变量的值去执行
print(list(g))  # 拿值list==>for==>__next__()
# 此时的
g = (add(n, i) for i in (add(n, i) for i in test()))
# 代入变量的值
# n = 10
# test()的取值范围是[0,1,2,3]
# 所以
# list(g) == [(add(10, i) for i in (add(10, i) for i in [0,1,2,3]))]==10*2+[0,1,2,3]
#         == [(add(10, i) for i in [10,11,12,13]]
#         == [20,21,22,23]


# 小结规律:
# test()的取值范围是初始范围
# 要拿值时候的n的值是要带入的值
# for循环决定循环的次数,循环几次就累加几次,也就是要加几个n的值

############################################################################################### # 改变1 def add(a, b): # 相加 return a + b def test(): # 生成器函数 0 1 2 3 for i in range(4): yield i g = test() # 创建生成器 for n in [2, 10]: g = (add(n, i) for i in g) n = 5 print(list(g)) # 结果:[10,11,12,13] # 解题思路同上,最终拿到 # g = (add(n, i) for i in (add(n, i) for i in test())) # 而此时n=5,带入得到 5*2+[0,1,2,3]=[10,11,12,13] ######################################################################################### # 改变2 def add(a, b): # 相加 return a + b def test(): # 生成器函数 0 1 2 3 for i in range(4): yield i g = test() # 创建生成器 for n in [2, 10, 5]: g = (add(n, i) for i in g) print(list(g)) # 结果:[15,16,17,18] # 解题思路同上,最终拿到 n = 2 g = (add(n, i) for i in g) n = 10 g = (add(n, i) for i in g) n = 5 g = (add(n, i) for i in g) # 层层代入得到: n = 2 g = (add(n, i) for i in test()) n = 10 g = (add(n, i) for i in (add(n, i) for i in test())) n = 5 g = (add(n, i) for i in (add(n, i) for i in (add(n, i) for i in test()))) # 代入数据得到: list(g) = (add(5, i) for i in (add(5, i) for i in (add(5, i) for i in [0,1,2,3])))=5*3+[0,1,2,3]=[15,16,17,18]
#区别生成器表达式和列表生成式:

    def add(a, b):
        return a + b
    
    
    def test():
        # print("123")
        for i in range(4):#[0,1,2,3]
            yield i
    
    g = test()
    
    for n in [2, 10, 5]:
        # 第一种:生成器表达式
        # g = (add(n, i) for i in g)  # [15, 16, 17, 18]在生成器表达式内部的生成器或者生成器表达式是不会执行的,直到外部的生成器有人找它要值
        # 第二种:列表生成式,是会直接带入执行的
        g = [add(n, i) for i in g]  # [17, 18, 19, 20]
    #第一种:
    # 对for循环进行等价替换,全部代入n=5
    # g1 = (add(5, i) for i in g)  #g = test()= [0,1,2,3]
    # g2 = (add(5, i) for i in g1)
    # g3 = (add(5, i) for i in g2)
    #第二种:
    # 对for循环进行等价替换,分别代入n=2,10,5
    # g1 = (add(2, i) for i in g)  #g = test()= [0,1,2,3]
    # g2 = (add(10, i) for i in g1)
    # g3 = (add(5, i) for i in g2)
    
    
    
    print(list(g))

 

 

 
 

 

posted on 2019-06-17 16:28  Lyf凤  阅读(483)  评论(0)    收藏  举报

导航

levels of contents