那些年用Python踩过的坑

文章目录

    •   引言
      • 一、基础常识类
        • 1 关于map 与 lambda表达式
        • 2 全局变量 global
      • 二、bug与问题细节类
      • 三、技巧类

  引言

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
热爱写作,愿意让自己成为更好的人…


在这里插入图片描述

铭记于心
我唯一知道的,便是我一无所知

一、基础常识类

1 关于map 与 lambda表达式

  • map(函数,可迭代对象(列表等)),返回map对象,可用list转换成列表,可用for in便遍历

  • 当使用map时只是封装了一个map对象,此时并没有进行运算,需要list( )转换时才会运算

那些年用Python踩过的坑_第1张图片

函数体或者lambda表达式中 创建局部变量与 全局变量重名,则函数体内会以新创建的 局部变量为准

那些年用Python踩过的坑_第2张图片

  • Lambda表达式还可以结合自定义函数使用(除了与map外)

    def con(args):
        x1min,x1max,x2min,x2max,x3min,x3max = args
        cons = ({'type':'ineq','fun':lambda x : x[0] - x1min},\
            {'type':'ineq','fun':lambda x:-x[0] + x1max},\
            {'type':'ineq','fun':lambda x:x[1] - x2min},\
            {'type':'ineq','fun':lambda x:-x[1] + x2max},\
            {'type':'ineq','fun':lambda x:x[2] - x3min},\
            {'type':'ineq','fun':lambda x:-x[2] + x3max})
        return cons
    
    

2 全局变量 global

t=1
global tt=1
此时 t与tt都是全局变量

但是
def test():
  t=2
  global tt=2
此时t为局部变量,tt则是全局
下面 print(t)print(tt)正确 

函数体内使用全局变量的方法是
 index =0
 def t():
   global index
   index+=1

  • 海象运算符的优先级是低于关系运算符的

  • 小数精确运算模块decimal

    import decimal
    print(decimal.Decimal('111.111')+decimal.Decimal('222.222'))
    
    333.333
    
  • 类型转换: int( ),str( )等

  • if else的几种写法

    msg = "大于" if a > b else "小于"
    print('大于') if a > b else print("小于")
    msg = ("a小于b", "a大于b")[a > b]
    msg = {2: '=2', 1: '=1', 3: '=3'}[b - a]
    
    

二、bug与问题细节类

  • 如果出现莫名其妙的问题,可以关闭python环境重新打开,比如上次 Pillow的grab 截图时出现 什么XCB不支持,结果重开pycharm就好了

  • 对于非列表与字典,numpy库等copy后更改不会影响到原副本但是对列表等可迭代对象却只是浅拷贝(一维表的时候复制的是值,不会对原表造成影响,但如果是二维表,则会拷贝其中一维表的内存地址,这时候如果对其中的值操作会使原表受到影响),深拷贝只能用deepcopy(需导入copy模块)

  • 类中调用类的方法一定要加self,并且向方法传递实参的时候无需传self

  • python中可用r’\\'解决 编程语言中字符串使用 正则表达式 需要用\\\\表示 \的问题

  • re findall方法会 返回匹配到的所有字符串,如果正则表达式里有 捕获,那么只返回匹配到的字符串的 捕获的组

  • 单独赋给一个字符串时r这些标志符才生效

    那些年用Python踩过的坑_第3张图片

三、技巧类

  • 循环体中不需要使用自定义变量的话,可用_代替

  • python中else if 为elif;对不可变类型重新赋值,会指向一片新的空间,原空间会被抛弃(权限被系统收回)

  • for 变量 in 可迭代对象(字符串或序列) 即以循环方式将可迭代对象中的元素依次取出

  • print()自动换行,但是可以在()里语句后加入end =’ ’ 即为用空格代替换行,='\t’即为用\t 代替

  • decode方法是将字节数组 解码为字符串,然后encode是将字符串 编码成字节数组

  • Natsort自然排序模块

  • x = eval(input('input x: ')) eval()将输入作为表达式运算

  • set()去重,Counter 对字符串(列表)进行计数追踪,

  • a, b = map(int, input().strip().split())

  • del关键字 删除的是 变量本身,而不是其引用的数据,也就是 使用del a,再引用a则会报错

  • 内置函数 enumerate(list) 可取下标 len()计算长度

  • import 的包没有用到 会呈现灰色,但是也是已经导入了的,只是没用到而已(所以最好优化导入,避免产生包冲突)

  • type() 返回数据结构类型(list、dict、numpy.ndarray 等)

  • dtype 返回数据元素的数据类型(int、float等)

  • astype() 改变np.array中所有数据元素的数据类型]

  • print(line, end=‘\r’)打印一行消失一行

  • 字典对值排序:sorted(dic.items(),key=lambda x: x[1]),逆向的话 如果是数值 可以 -x[1/0]

    如果有多个值,取其中几个降级排序,则可以用 operator.itrmgetter (整数序列,表示要取得下标) 获得

写在最后
路漫漫其修远兮,吾将上下而求索!伙伴们,再见!在这里插入图片描述

你可能感兴趣的:(Python那年那些事,python,开发语言,深度学习)