python技巧大合集

1.文件读取

import os
 
path = input('请输入文件夹路径:')
 
# 获取该目录下所有文件,存入列表中
fileList = os.listdir(path)

1.1从这里开始是文件重命名

for inner_file in fileList:
    # 获取旧文件名(就是路径+文件名)
    old_name = path + os.sep(分隔符) + inner_file  # os.sep添加系统分隔符
    if os.path.isdir(old_name):  # 如果是目录则跳过
        continue
 
    # 设置新文件名
    new_name = 请自由发挥
    os.rename(old_name, new_name)  # 用os模块中的rename方法对文件改名
    n += 1

1.2图片缩放尺寸

for infile in fileList:
    im = Image.open(path+os.sep+infile)
    (x,y) = im.size #读取图片尺寸(像素)
    w_s = 640 #定义缩小后的标准宽度
    h_s = 480 #基于标准宽度计算缩小后的高度
    out = im.resize((w_s,h_s),Image.ANTIALIAS) #改变尺寸,保持图片高品质
    out.save('pictures_{}'.format(infile.split("//")[-1]))

2.嵌套函数下层函数修改上层函数变量值

问题:在嵌套函数,即def fun1():def fun2()类型的函数中,如果函数fun2想要修改fun1中的变量,就不能用global来声明变量了,因为它不是全局变量,只是上层函数中的变量。

解法:用nonlocal声明变量,比如力扣_八皇后问题II的解法,如下

class Solution:
    
    def totalNQueens(self, n: int) -> int:
        colomn = set()
        zuoxie = set()
        youxie = set()
        ans = 0
        def iterate(raw):
           
            if raw == n:
                nonlocal ans
                ans += 1

            for i in range(n):
                if i in colomn or (i+raw) in youxie or (i - raw) in zuoxie:
                    continue
                colomn.add(i)
                zuoxie.add(i - raw)
                youxie.add(i+raw)
                iterate(raw+1)
                colomn.remove(i)
                zuoxie.remove(i - raw)
                youxie.remove(i+raw)
            return ans
        
        return iterate(0)

怎样让ans随内层函数递归叠加出最终答案是重点,有三种方法:1.类外定义global ans,不行。2.定义类属性ans,类方法内部调用self.ans+=1,通过;3.用nonlocal ans改变上层函数的变量,也通过。     

但如果是多层嵌套函数,每一层都有一个ans,最底层函数funn它会改变哪一层的ans呢?

不用试了,只改变其上一层,其他不变,焯!         

3.python 多维列表初始化

Python的列表相比于c++,很坑爹的一点是如果访问未赋值列表单元的位置,是不能直接访问的(而c++有默认值为0),例如:

    lis = list(list())
    lis[1][1]

这是会报错的,会提示你out of range 了。

这时如果我们想要用lis[i][j]来添加列表元素是不行的,因此我们需要为列表赋初值(当然,仅限于已知列表尺寸的情况)

我们可以用2种方法对其进行初始化,以二维数组为例:
方法1:

lis = [[None]*m]*n

这种方法会导致该列表的每个子列表都指向相同的,也就是改了lis[i][1],lis[j][1]也会改,不推荐
方法2:

lis = [[None for i in range(m)]for j in range(n)]

这种方法不会导致上述问题,并能初始化大小为n*m的列表(注意:这里越外面的尺寸,越顶层,即代表越【靠前】的[]的最大值)。并且能够用.append()在后面加东西。


4.collections模块

collections是Python内建的一个集合模块,提供了许多有用的集合类和方法。包括以下类型的变量

['ChainMap', 'Counter', 'Mapping', 'MutableMapping', 'OrderedDict', 'UserDict', 'UserList', 'UserString', '_Link', '_OrderedDictItemsView', '_OrderedDictKeysView', '_OrderedDictValuesView', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__getattr__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_chain', '_collections_abc', '_count_elements', '_eq', '_heapq', '_iskeyword', '_itemgetter', '_nt_itemgetters', '_proxy', '_recursive_repr', '_repeat', '_starmap', '_sys', 'abc', 'defaultdict', 'deque', 'namedtuple']

常用方法有如下几种

4.1 deque :

xxx = collections.deque([iterable[, maxlen]])

高效增删改双向列表,类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)

    iterable :迭代对象,可以是字符串,列表等可迭代对象。

    maxlen : maxlen 没有指定或者是 None , deque 可以增长到任意长度。否则, deque 就限定到指定最大长度。一旦限定长度的 deque 满了,当新项加入时,同样数量的项就从另一端弹出。

方法

    append(x):添加 x 到右端。
     
    appendleft(x):添加 x 到左端。
     
    clear():移除所有元素,使其长度为0.
     
    copy():创建一份浅拷贝。3.5 新版功能.
     
    count(x):计算deque中个数等于 x 的元素。3.2 新版功能.
     
    extend(iterable):扩展deque的右侧,通过添加iterable参数中的元素。
     
    extendleft(iterable):扩展deque的左侧,通过添加iterable参数中的元素。注意,左添加时,在结果中iterable参数中的顺序将被反过来添加。
     
    index(x[, start[, stop]]):返回第 x 个元素(从 start 开始计算,在 stop 之前)。返回第一个匹配,如果没找到的话,升起 ValueError 。3.5 新版功能.
     
    insert(i, x):在位置 i 插入 x 。如果插入会导致一个限长deque超出长度 maxlen 的话,就升起一个 IndexError 。3.5 新版功能.
     
    pop():移去并且返回一个元素,deque最右侧的那一个。如果没有元素的话,就升起 IndexError 索引错误。
     
    popleft():移去并且返回一个元素,deque最左侧的那一个。如果没有元素的话,就升起 IndexError 索引错误。
     
    remove(value):移去找到的第一个 value。 如果没有的话就升起 ValueError 。
     
    reverse():将deque逆序排列。返回 None 。3.2 新版功能.
     
    rotate(n=1):向右循环移动 n 步。 如果 n 是负数,就向左循环。如果deque不是空的,向右循环移动一步就等价于 d.appendleft(d.pop()) , 向左循环一步就等价于 d.append(d.popleft()) 。
     
    Deque对象同样提供了一个只读属性:
    maxlen:Deque的最大尺寸,如果没有限定的话就是 None 。

4.2 defaultdict :

需要from collections import defaultdict:或import collections,调用时用collections.defaultdict。

作用:当使用dic[key]时,如果没有需要的key,传统dict会报错,而defaultdict不会,他会给出一个默认值作为值,而这个默认值的内容及格式可以自己设定

核心公式: dict = defaultdict(默认格式)

默认格式如:int,float,set,str,list等

5.字典及其方法

字典是能够实现搜索时间复杂度O(1)的数据类型,由键值对组成,其键具有唯一性(所以不知道有了dict还要set干金毛)


5.1初始化

    dic = dict()  

    dic={}

5.2 增、改(其他放在方法里)

    dic[key] = value

5.3 其他方法


删除

    del dic[key] #删除指定键值对
    dic.clear()#清空字典,但字典仍然保留
    val  = dic.pop(key, item )#删除指定键值对,并且将删除 值赋给变量(也可以不接收);如果dic中没有这个key,val = item
    val = dic.popitem()#随机删除一个字典中的键值对,并把值赋给val

索引或新增

temp = dic.setdefault(key,val)

如果dic中有key,temp会等于value;如果没有,temp会等于val,并且dic中会新增key:val的键值对。

而如果是 temp = dic.get(key,val),则字典内不会新增键值对,其他同上


6.基础内置函数操作

6.1 sort()函数

使用方法:

list.sort() 或sorted(list)。

不需要赋值,排序后结果直接存在list中。默认从小到大排列。

参数

key = 函数。

用于定义排序规则,最常用的就是lambda函数:

        list.sort(key = lambda list:list[0]) #比如列表中每个元素都是元组,按某一项的大小顺序排列,这是很常见的。

或者直接写一个函数:

def sort_key(company):
    return company[2]



# sort the companies by revenue
companies.sort(key=sort_key, reverse=True)

定义规则就是函数的返回值。

甚至可以有多个规则,解决相同的两个元素的顺序:

l = [[1,2,2],[2,2,1],[2,1,3]]

l.sort(key = lambda x: (-x[2],x[1]))
#表示按第三个元素的降序排列,然后再根据第二个元素的升序排

是否反转reversed:

reversed默认FALSE,可以改为true,即从大到小排列

注意

如果是依靠字符串排列大小,则对它们的ascii码排列,直接排就行,非常方便。

6.2 取整

round() 四舍五入

res = round(val,位数)

floor()向下取整和ceil()向上取整

同属于math库的方法。

res = math.floor(val,位数)

6.3 快速求阶乘 functional()

math.functional(val)

                         

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值