python基础知识点

一.property将方法变为属性

class Student(object):

    def get_score(self):
        return self._score

    def set_score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value
S1=Student()
S1.set_score(59)
print(S1.get_score())


class Student(object):
    @property  #把方法变为属性
    def get_score(self):
        return self._score

    def set_score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value


S1 = Student()
S1.set_score(59)
print(S1.get_score)

二.sys.argv

第一个元素sys.argv[0] 是程序本身,随后是外部给的参数

test.py代码

三.命令行解析args

import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('square', help="display a square of a given number")
args=parser.parse_args()
print(args.square**2)



发生类型错误 

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('square', help="display a square of a given number",type=int)
args=parser.parse_args()
print(args.square**2)

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--square', help="display a square of a given number",type=int)
args=parser.parse_args()
print(args.square**2)

四.python常见的* 与 **

1.* 可起解压迭代对象的特性

a, *b, c = range(1, 11)
print('a,b,c===', a, b, c)

a, *b, c = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]#range(1, 11)
print('a,b,c===', a, b, c)

接受不定长参数*args

# 接收不定长参数*args 
def fun_var_args(farg, *args):  
    print("arg:", farg)
    for value in args:  
        print("another arg:", value)

fun_var_args(1, 2, 3) # *args可以当作可容纳多个变量组成的list  

*args可以当作可容纳多个变量组成的list  

# 传收不定长参数*args
def fun_var_args_call(arg1, arg2, arg3):
    print("arg1:", arg1)
    print("arg2:", arg2)
    print("arg3:", arg3)

args = [2, 3] #list

fun_var_args_call(1, *args)

2.**  起传收不定长参数的作用 **kwargs

# 接收不定长参数**kwargs
def fun_var_kwargs(arg1, **kwargs):
    print("arg1:", arg1)
    for key in kwargs:
        print("%s: %s" % (key, kwargs[key]))


fun_var_kwargs(arg1=1, arg2=2, arg3=3) # **kwargs可以当作容纳多个key和value的dict

**kwargs可以当作容纳多个key和value的dict 

# 传收不定长参数**kwargs
def fun_var_args_call(arg1, arg2, arg3):
    print("arg1:", arg1)
    print("arg2:", arg2)
    print("arg3:", arg3)

kwargs = {"arg3": 3, "arg2": 2} # dictionary

fun_var_args_call(1, **kwargs)

# 接收不定长参数**kwargs
def fun_var_kwargs(arg1, **kwargs):
    print("arg1:", arg1)
    print('kwargs=',kwargs)
    for key in kwargs:
        print("%s: %s" % (key, kwargs[key]))

kwargs = {"arg3": 3, "arg2": 2} # dictionary
fun_var_kwargs(arg1=1, **kwargs) # **kwargs可以当作容纳多个key和value的dict

3. **用于字典更新

a = {1:'aaa'}
b = {2:'bb'}
res = {**a, **b}
print('==res:', res)

总结:

list变量前面加星号,字典变量前面加两个星号:

列表前面加星号作用是将列表解开成两个独立的参数,传入函数,

字典前面加两个星号,是将字典解开成独立的元素作为形参。

    def add(a, b):
        return a + b
    
    data = [4, 3]
    print(add(*data))
    data = {'a': 4, 'b': 3}
    print(add(**data))

五.sys.modules[self.__class__.__module__].__file__

#coding:utf-8
import sys
import os
class Vgg16:
    def __init__(self, vgg16_npy_path=None):
        if vgg16_npy_path is None:
            path = sys.modules[self.__class__.__module__].__file__
            print(path)
            # print path
            #上级目录
            print(os.pardir)
            path = os.path.abspath(os.path.join(path, os.pardir))
            print path
vgg=Vgg16()

sys.modules[self.__class__.__module__].__file__打印当前,.py文件的绝对路径

os.pardir打印两个..h号

两个一join就返回到上层目录

os.path.basename(__file__) 打印出当前的.py文件

六.zip

1.zip两个列表

a = [1,2,3]
b = [4,5,6]
c = [4,5,6,7,8]
zipped = zip(a,b)     # 打包为元组的列表
print(list(zipped))
print(list(zip(*(a, b))))
print(*(a, b))

2.矩阵转置

a =[[1, 2, 3],
    [4, 5, 6]]
print(*a)

a=[1,2,3]
b=[4,5,6]
zipped=list(zip(a,b))
#压缩
print(zipped)
#解压
print(list(zip(*zipped)))

可用列表与相应的索引匹配。

line=[[6, 3], [1, 3], [2, 5]]
line=sorted(line)
print(line)
line=sorted(line,key=lambda x:x[1])
print(line)

sorted默认,第一个排序,加上x[1]才是第二个,对于zip后的列表同样适用。

classes=('back','bus')
num_classes=len(classes)
print(list(range(num_classes)))
print(list(zip(classes,list(range(num_classes)))))
a=dict(list(zip(classes, list(range(num_classes)))))
print(a)

可看出,假设img是1,4是label,则两个就形成了一一对应。

dic={'a':0,'b':3,'c':1}
res=max(dic.items(), key=lambda x: x[1])[0]
print(res)

res = sorted(dic.items(), key=lambda x: x[1])
print(res)

dict key和value互转


dict_label = {'平和': 0, '气虚': 1, '气郁': 2, '湿热': 3, '特禀': 4,
                  '痰湿': 5, '血瘀': 6, '阳虚': 7, '阴虚': 8}
print(dict_label.values(), dict_label.keys())
print(list(zip(dict_label.values(), dict_label.keys())))
dict_label_tran = dict(zip(dict_label.values(), dict_label.keys()))
print(dict_label_tran)

七.python字典in 字典无序性

1.用于判断key是否在字典中

a={}
a['b']=1

print(a)
print('b' in a)

2.update更新字典 

a={'a':1}
b={'b':2}
a.update(b)
print(a)

#合并字典
x = {'a': 1, 'b': 2}
y = {'b': 3, 'c': 4}
print({**x, **y})

#更新字典
y.update(x)
print(y)

setdefault更新字典

a = {}
    # a.setdefault('1.xml', '/xxx/xxx/1.xml')
    # print('a:', a)
    a['1.xml'] = '/xxx/xxx/1.xml'
    a.setdefault('2.xml', '/xxx/xxx/2.xml')
    print('a:', a)

#
z = {'b': 2, 'c': 4, 'a': 1}
for key, value in z.items():
    print(key, value)
print('============or========')
for key in z:
    print(key, z[key])

#字典推导式
fruits = ['apple', 'mango', 'banana','cherry']
a={f:len(f) for f in fruits}
print(a)

3.字典排序

字典本质上是个无序的容器对象(其实Python3.6开始支持有序,不过这个有序是指按照key的添加顺序),如果我们要对字典的 key 或者 value 排序,一般是将其转换为list,再按照key或者value排序。

import operator
d = {"c": 3, "a": 1, "f":6, "b": 0}
# 按照value排序
print(sorted(d.items(), key=lambda x:x[1]))
print(sorted(d.items(), key=operator.itemgetter(1)))
print('=========================================')
# 按照key排序
print(sorted(d.items(), key=lambda x:x[0]))
print(sorted(d.items(), key=operator.itemgetter(0)))

对字典的value值排序,利用lambda找出dict的value最大值,并对value排序后,获取相应的字典

    dic = {'1666.jpg': 0.4404807686805725, '10885.jpg': 0.4567480981349945}
    print(max(dic.items(), key=lambda x: x[1]))
    print(max(dic.items(), key=lambda x: x[1])[0])
    dic=sorted(dic.items(),key=lambda x:x[1],reverse=True)
    print(dic)
    print(dict(dic))

对列表的字典排序

lis = [{"name": "Taobao", "age": 100},
       {"name": "Runoob", "age": 7},
       {"name": "Google", "age": 100},
       {"name": "Wiki", "age": 200}]

# 通过 age 升序排序
print("列表通过 age 升序排序: ")
print(sorted(lis, key=lambda i: i['age']))
print("列表通过 先age后 name 升序排序: ")
print(sorted(lis, key=lambda i: (i['age'], i['name'])))

get方法

task = [1, 1, 1, 0, 0]

task_dict = {}
for i in task:
    task_dict[i] = task_dict.get(i, 0)+1
print('task_dict:', task_dict)

4.统计列表中每个字母出现的次数

chars=['a','b','a','c','c','d']
a={}
for i in chars:
    if i in a:
        a[i]+=1
    else:
        a[i]=0
print(a)

import operator
d=sorted(a.items(), key=operator.itemgetter(1))
print(d)
print(d[-1])

八.可用于判断正符号

def choice(x):
    res=[-1,1][x>0]
    return res
res=choice(3)
print(res)
res=choice(-3)
print(res)

九.lambda 匿名函数

[:-2]指丢掉后两位

nums=[1,2,3,4,5]
print(nums[0:-2])


add = lambda x, y : x+y
print(add(1,2))

list1 = [3,5,-4,-1,0,-2,-6]
#按照绝对值大小排序
list1.sort(key=lambda x: abs(x))
print(list1)

十.random choice, 从列表或元组里随机产生一个数

import random
print("choice([1, 2, 3, 5, 9]) : ", random.choice([1, 2, 3, 5, 9]))
print("choice('A String') : ", random.choice('A String'))

random.sample,从a中随机产生2个独立的元素

import random
a=np.array([[1,2],[3,4],[5,6]])
a=a.tolist()
print('a=',a)
b=random.sample(a,2)
print('b=',b)

十一.filter过滤器(函数表达式)

def is_odd(n):
    return n % 2 == 1
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(newlist)
print(list(newlist))

对于python2返回的是list,而对于python3返回的是可迭代类型,这时候需要转换成list

 mask rcnn model.py里的一句话,用来冻结层

if exclude:
    layers = filter(lambda l: l.name not in exclude, layers)

十二.map映射(函数表达式)

map作用的是每个元素

def square(x):
    return x**2
res=map(square,[1,2,3,4,5])
print(res)
print(list(res))

对于python2返回的是list,python3返回的是可迭代类型,需要转换成list

答题的时候

M, N = list(map(int, input().split(',')))
print(M,N)

print(list(map(int,'10')))
print(list(map(int,'10,11'.split(','))))
print(type(input()))

l1=[1,3,5,20,9]
l2=[2,4,6,8,10]
mins=map(min,l1,l2)
print(list(mins))

map+lambda

x = [1, 2, 3]
    y = list(map(lambda x: x + 1, x))
    print('y:',y)

十三.reduce (函数表达式)

1.列表数字和

reduce累计运算,适合做大数据的运算,reduce只能接受2个参数,作用在序列的第一个元素得到结果后,把这个结果继续与下一个元素作用(累积计算).

def add(x, y):  # 两数相加
    return x + y
from functools import reduce
a=reduce(add, [1, 2, 3, 4, 5])  # 计算列表和:1+2+3+4+5
print(a)
b=reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函数
print(b)

2.列表合并

from functools import reduce

l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
res = reduce(lambda x, y: x+y, l)
print('==res:', res)

十四.join,用来连接列表或元组里的元素

a=['a','b','cd','d']
b=('a','b','cd','d')
str='.'
print(str.join(a))
print(''.join(b))

 一行话,将int型连起来

a=[1,2,3,4]
result=int(''.join([str(i) for i in a]))
print(result)
print(type(result))
a=int(''.join(map(str,a)))

十五.tqdm使用

from tqdm import tqdm
for i in tqdm(range(1000)):
    # do something
    pass

十六.if语句一句话

[对(x)的操作 for x in 集合 if 条件]

[对(x,y)的操作 for x in 集合1 for y in 集合2 if 条件]

#让两个list中的偶数分别相加,应该结果是2+6,4+6,2+8,4+8
x=[1,2,3,4]
y=[5,6,7,8]
res=[i+j for i in x for j in y if i%2==0 and j%2==0]
print(res)

1.常规

if a>b:
    c = a
else:
    c = b

2.表达式

c=a if a>b else b

3.二维列表

c=[b,a][a>b]

4.加上列表的if else

print([i if i == 0 else 100 for i in range(10)])

十七.装饰器

统计函数的运行时间

1,#最简单做法

import time
def func():
    print("hello")
    time.sleep(1)
    print("world")

def func_1():
    startTime = time.time()

    func()
    endTime = time.time()

    msecs = (endTime - startTime)*1000
    print("time is %d ms" %msecs)
print(func_1())

2,#模拟装饰器的写法

def deco(func):
    startTime = time.time()
    func()
    endTime = time.time()
    msecs = (endTime - startTime)*1000
    print("time is %d ms" %msecs)

def func():
    print("hello")
    time.sleep(1)
    print("world")

if __name__ == '__main__':
    f = func
    deco(f)#只有把func()或者f()作为参数执行,新加入功能才会生效
    print("f.name is",f.__name__)#f的name就是func()

3,#最简陋的装饰器,先执行装饰器,在执行函数本身

def deco(func):
    def wrapper():
        startTime = time.time()
        func()
        endTime = time.time()
        msecs = (endTime - startTime)*1000
        print("time is %d ms" %msecs)
    return wrapper

@deco
def func():
    print("hello")
    time.sleep(1)
    print("world")

if __name__ == '__main__':
    f = func #这里f被赋值为func,执行f()就是执行func()
    f()

4,#加参数的装饰器

def deco(func):
    def wrapper(a,b):
        startTime = time.time()
        func(a,b)
        endTime = time.time()
        msecs = (endTime - startTime)*1000
        print("time is %d ms" %msecs)
    return wrapper

@deco
def func(a,b):
    print("hello")
    time.sleep(1)
    print("world")
    print('a+b=',a+b)

if __name__ == '__main__':
    f = func #这里f被赋值为func,执行f()就是执行func()
    f(1,2)

5,#带不定参数的装饰器

def deco(func):
    def wrapper(*args,**kwargs):
        startTime = time.time()
        func(*args,**kwargs)
        endTime = time.time()
        msecs = (endTime - startTime)*1000
        print("time is %d ms" %msecs)
    return wrapper

@deco
def func(a,b):
    print("hello")
    time.sleep(1)
    print("world")
    print('a+b=',a+b)
@deco
def func2(a,b,c):
    print("hello")
    time.sleep(1)
    print("world")
    print('a+b+c=',a+b+c)

if __name__ == '__main__':
    f = func #这里f被赋值为func,执行f()就是执行func()
    f(1,2)
    func2(1,2,3)

6.使用

def compute_time_deco(function):
    def warpper(*args, **kwargs):
        st = time.time()
        res = function(*args, **kwargs)
        print('{}:spend time:{}'.format(function.__name__, time.time() - st))
        return res
    return warpper

7.统计超时装饰器

注意:使用 @functools.wraps 的目的是因为被装饰的 func 函数元信息会被替换为 wrapper 函数的元信息,而 @functools.wraps(func) 将 wrapper 函数的元信息替换为 func 函数的元信息。最终虽然返回的是 wrapper 函数,元信息却依然是原有的 func 函数.注释了也没影响。


import functools
from concurrent.futures import ThreadPoolExecutor

executor = ThreadPoolExecutor(1)
def timeout(seconds):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            future = executor.submit(func, *args, **kw)
            # print('===future.result:', future.result)
            return future.result(timeout=seconds)
        return wrapper
    return decorator

import time
@timeout(1)
def task(a, b):
    time.sleep(0.8)
    return a+b

res = task(2, 3)
print('==res:', res)

8.统计超时 类装饰器

#类装饰器
import functools
from concurrent.futures import ThreadPoolExecutor

class TimeOut:
    __executor = ThreadPoolExecutor(1)

    def __init__(self, seconds):
        self.seconds = seconds

    def __call__(self, func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            future = TimeOut.__executor.submit(func, *args, **kw)
            return future.result(timeout=self.seconds)
        return wrapper

import time
@TimeOut(1)
def task(a, b):
    time.sleep(1.2)
    return a+b

res = task(2, 3)
print('==res:', res)

9.统计函数用时

import time
import functools
def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        res = func(*args, **kwargs)
        end = time.time()
        print('函数{}耗时{}s'.format(func.__name__, end - start))
        return res
    return wrapper


@log
def now():
    print('2021-7-1')
now()

10.约束某个函数的可执行次数

import functools
class allow_count:
    def __init__(self, count):
        self.count = count
        self.i = 0

    def __call__(self, func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            if self.i >= self.count:
                return
            self.i += 1
            return func(*args, **kw)
        return wrapper

@allow_count(3)
def job(x):
    x += 1
    return x

for i in range(5):
    print('===job(i):', job(i))

十八.np.array,np.asarray

array和asarray都可以将结构数据转化为ndarray,但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会,故改变源数据时,通过array的副本不会变化,而asarray的副本会变化。

# example 1:
data1 = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
arr2 = np.array(data1)
arr3 = np.asarray(data1)
data1[1][1] = 2
print('data1:\n', data1)
print('arr2:\n', arr2)
print('arr3:\n', arr3)

数据源为ndarray

# example 1:
data1 = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])
arr2 = np.array(data1)
arr3 = np.asarray(data1)
data1[1][1] = 2
print('data1:\n', data1)
print('arr2:\n', arr2)
print('arr3:\n', arr3)

十九. 深拷贝,浅拷贝

1.对于不可变类型(数值,字符串,布尔值),无论怎么改变变量名,id值(数据的内存地址)都不会变

str1 = 'haha'
print('==str1:', id(str1))
str2 = 'haha'
print('==str2:', id(str2))

import copy
str3 = copy.copy('haha')
print('==str3:', id(str3))
str4 = copy.deepcopy('haha')
print('==str4:', id(str4))

2.对于可变类型(list dict set),虽然相同数据,但是内存仍然会开辟新的内存地址来存放相同的数据。

import copy
list1 = [1, 2, 3]
print('==id(list1):', id(list1))
list2 = [1, 2, 3]
print('==id(list2):', id(list2))

3.深浅拷贝

3.1如果只针对不可变数据类型,深浅拷贝的对象和原数据对象都是相同的内存地址

str1 = 'haha'
print('==str1:', id(str1))
str2 = str1
print('==str2:', id(str2))

import copy
str3 = copy.copy(str1)
print('==str3:', id(str3))
str4 = copy.deepcopy(str1)
print('==str4:', id(str4))

3.2对于可变类型(list dict set)深浅拷贝

3.2.1 浅拷贝

列表本身的浅拷贝对象的地址和原对象的地址是不同的,因为列表是可变数据类型。列表中的元素(第1个元素为例)和浅拷贝对象中的第一个元素的地址是相同的,因为元素本身是数值型,是不可变的

import copy
list1 = [1, 2, 3]
print('==id(list1):', id(list1))
list2 = copy.copy(list1)
print('==id(list2):', id(list2))

print('==id(list1[0]):', id(list1[0]))
print('==id(list2[0]):', id(list2[0]))

如果列表存在嵌套,浅拷贝只拷贝最外层数据,导致最外层内存地址发生变化,而里面的内存地址不会变.

import copy
list1 = [1, 2, [3, 4, 5]]
print('==id(list1):', id(list1))
list2 = copy.copy(list1)
print('==id(list2):', id(list2))

print('==id(list1[0]):', id(list1[0]))
print('==id(list2[0]):', id(list2[0]))


print('==id(list1[-1]):', id(list1[-1]))
print('==id(list2[-1]):', id(list2[-1]))

3.2.1 深拷贝

如果列表存在嵌套,深拷贝对最外层数据是只拷贝数据,会开辟新的内存地址来存放数据。深拷贝对里面的不可变数据类型直接复制数据和地址,和可变类型的浅拷贝是相同的效果。


import copy

list1 = [1, 2, [3, 4, 5]]

list2 = copy.copy(list1)
list3 = copy.deepcopy(list1)
print('==id(list1):', id(list1))
print('==id(list2):', id(list2))
print('==id(list3):', id(list3))

print('==id(list1[0]):', id(list1[0]))
print('==id(list2[0]):', id(list2[0]))
print('==id(list3[0]):', id(list3[0]))

print('==id(list1[-1]):', id(list1[-1]))
print('==id(list2[-1]):', id(list2[-1]))
print('==id(list3[-1]):', id(list3[-1]))


list1[-1][0] = 100
print('==list1:', list1)
print('==list2:', list2)
print('==list3:', list3)
print('==id(list1[-1]):', id(list1[-1]))
print('==id(list2[-1]):', id(list2[-1]))
print('==id(list3[-1]):', id(list3[-1]))

总结:

#浅拷贝和深拷贝
#浅拷贝只拷贝父类 不拷贝子类
a={1:[1,2,3]}
print('=======原始值地址========')
print('id(a)=',id(a))
print('id(a[1])=',id(a[1]))
b=a
#复制全都一样
print('====普通赋值=====')
print('id(b)=',id(b))
print('id(b[1])=',id(b[1]))

c=a.copy()
#父类的地址不一样 因为拷贝了
print('====浅拷贝=====')
print('id(c)=',id(c))
print('id(c[1])=',id(c[1]))
d=copy.deepcopy(a)
#地址都不一样
print('====深拷贝=====')
print('id(d)=',id(d))
print('id(d[1])=',id(d[1]))

二十. getattr() 函数用于返回一个对象属性值

class A(object):
    bar=1
    def __init__(self):
        print('init')
    def train(self):
        print('call train')
if __name__ == '__main__':
    a=A()
    print(getattr(a,'bar'))
    print(getattr(a,'train')())

二十一.python特殊函数,__len()__,__getitem__(),__iter()__

len()将类变现得像list,需要重写__len__方法

class Students(object):
    def __init__(self, *args):
        self.names = args

    def __len__(self):
        return len(self.names)
student=Students('a','b','c')
print(len(student))

class Animal:
    def __init__(self, animal_list):
        self.animals_name = animal_list
    # def __getitem__(self, item):
    #     return self.animals_name[item]

animals = Animal(["dog", "cat", "fish"])
for animal in animals:
    print(animal)

报错,Python的解释器就会去寻找__getitem__ 来迭代对象。

class Animal:
    def __init__(self, animal_list):
        self.animals_name = animal_list
    def __getitem__(self, item):
        return self.animals_name[item]

animals = Animal(["dog", "cat", "fish"])
for animal in animals:
    print(animal)

for … in… 这个语句其实做了两件事。第一件事是获得一个可迭代器,即调用了__iter__()函数。 
第二件事是循环的过程,循环调用next函数。对于test这个类来说,它定义了__iter__和next函数,所以是一个可迭代的类,也可以说是一个可迭代的对象(Python中一切皆对象)。

class test():
    def __init__(self, data=1):
        self.data = data

    def __iter__(self):
        return self

    def next(self):
        if self.data > 5:
            raise StopIteration
        else:
            self.data += 1
            return self.data

for item in test(3):
    print(item)

具体实例:可用于数据加载中

数据路径:

.py文件

#coding:utf-8
import torch as t
from torch.utils import data
import os
from PIL import Image
import numpy as np

class DogCat(data.Dataset):
    def __init__(self, path):
        imgs = os.listdir(path)
        # 所有图片的绝对路径
        # 这里不实际加载图片,只是指定路径,当调用__getitem__时才会真正读图片
        self.imgs_list_path = [os.path.join(path, i) for i in imgs]

    def __getitem__(self, index):
        img_path = self.imgs_list_path[index]
        # dog->1, cat->0
        label = 1 if 'dog' in img_path.split('/')[-1] else 0
        pil_img = Image.open(img_path)
        array = np.asarray(pil_img)
        img = t.from_numpy(array)
        return img_path,img, label

    def __len__(self):
        return len(self.imgs_list_path)
if __name__ == '__main__':
    dataset = DogCat('./data/dogcat/')
    # img, label = dataset[0]  # 相当于调用dataset.__getitem__(0)
    print('len(dataset)=',len(dataset))
    for img_path,img, label in dataset:
        print(img_path,img.size(), img.float().mean(), label)

结果: 

二十二:Collections的一些功能, collections 是容器数据类型,即列表,集合,元组,字典

1.Collections counter统计列表元素出现的次数

a=[1,2,3,4,5,6,3,'a','a','a']
from collections import Counter
cnt=Counter(a)
print(cnt)
print(cnt.most_common(3))

列表中频率最高的元素

a=[1,2,3,1,2,3,2,2,4,5,1]
print(max(set(a),key=a.count))

2.检查两个字符串是不是由相同字母不同顺序组成

from collections import Counter
str1='1234abc'
str2='3421bca'
print(Counter(str1)==Counter(str2))

3.deque用于队列  基于list优化了列表两端的增删数据操作


from collections import deque

d = deque([3, 2, 4, 0])

value = d.popleft() # 左侧移除元素,O(1)时间复杂度
print('==value:', value)

value = d.pop()# 末侧移除元素,O(1)时间复杂度
print('==value:', value)

d.appendleft(3)# 左侧添加元素,O(1)时间复杂度
print('=d:', d)

d.append(5)# 末侧添加元素,O(1)时间复杂度
print('=d:', d)

4.heapq:基于list优化的一个数据结构:堆队列,也称为优先队列。堆队列特点在于最小的元素总是在根结点:heap[0] 基本用法:

import heapq
a = [3, 1, 4, 5, 2, 1]

heapq.heapify(a) #对a建堆,建堆后完成对a的就地排序
print('a[0]:', a[0])

value = heapq.nlargest(4, a) #a的前3个最大元素
print('value:', value)

value = heapq.nsmallest(4, a) #a的前3个最小元素
print('value:', value)

5. defaultdict defaultdict是一种带有默认对象工厂的dict


words = ['book', 'nice', 'great']
d = {}
for i, word in enumerate(words):
    if word in d:
        d[word].append(i)
    else:
        d[word] = [i]# 显示的创建一个list
print('==d:', d)

from collections import defaultdict
d = defaultdict(list)# 创建字典值默认为list的字典
for i, word in enumerate(words):
    d[word] = i
print('==d:', d)
print(d['book'])

省去一层if逻辑判断,代码更加清晰。上面defaultdict(list)这行代码默认创建值为list的字典,还可以构造defaultdict(set), defaultdict(dict)等等,这种模式就是对象工厂,工厂里能制造各种对象:list,set,dict...

6.ChainMap 多个dict想要合并为一个大dict,比update省内存


from collections import ChainMap

d1 = {'a':1,'c':3,'b':2}

d2 = {'d':1,' e':5}

dm = ChainMap(d1, d2)

print(dm)
print(dm['c'])
print(dm['d'])

dm['c'] = 10
print(dm)

二十三.super() 函数是用于调用父类(超类)的一个方法。

def test_super():
    class A:
         def add(self, x):
             y = x+1
             print(y)
    class B(A):
        def add(self, x):
            super().add(x)
    b = B()
    b.add(2)  #3
class FooParent(object):
    def __init__(self):
        self.parent = 'I\'m the parent.'
        print ('Parent')

    def bar(self,message):
        print ("%s from Parent" % message)

class FooChild(FooParent):
    def __init__(self):
        # super(FooChild,self) 首先找到 FooChild 的父类(就是类 FooParent),然后把类B的对象 FooChild 转换为类 FooParent 的对象
        super(FooChild,self).__init__()
        print ('Child')

    def bar(self,message):
        super(FooChild, self).bar(message)
        print ('Child bar fuction')
        print (self.parent)

if __name__ == '__main__':
    fooChild = FooChild()
    fooChild.bar('HelloWorld')

二十四:itertools是一个包含很多面向可迭代对象的工具函数集

from itertools import product

a=[1,2,3]
b=[2,3,4]
c=[3,4,5]
def function(a,b,c):
    for i,j,k in product(a,b,c):
        print(i,j,k)
function(a,b,c) 

相当于

def function(a,b,c):
    for i in a:
        for j in b:
            for k in c:
                print(i,j,k)

二十五:读取h5

当print(data.keys())出现 KeysView(<HDF5 file "data.h5" (mode r)>)时,用遍历key的方式进行.

注意取数据时要这样Training_label[:]

import h5py
path='./fer2013/data/data.h5'
data=h5py.File(path,'r')
print(data.keys())
for i in data.keys():
    print(i)
Training_label=data['Training_label']
print(Training_label.shape)
print(Training_label[:])

二十六. 身份运算符:is,not is

is 是判断两个标识符是不是引用自一个对象

is 与 == 区别:

is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。

a = 20
b = 20
c = 30

if (a is b):
    print(" a和 b有相同的标识")
if (a is not c):
    print(" a和 c没有相同的标识")

【例子】比较的两个变量均指向不可变类型。
```python
a = "hello"
b = "hello"
print(a is b, a == b)  # True True
print(a is not b, a != b)  # False False
```

【例子】比较的两个变量均指向可变类型。
```python
a = ["hello"]
b = ["hello"]
print(a is b, a == b)  # False True
print(a is not b, a != b)  # True False
```

注意:
- is, is not 对比的是两个变量的内存地址
- ==, != 对比的是两个变量的值
- 比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not 和 ==,!= 是完全等价的。
- 对比的两个变量,指向的是地址可变的类型(list,dict等),则两者是有区别的。

二十七.函数的作用域

Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。

变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:

  • L (Local) 局部作用域
  • E (Enclosing) 闭包函数外的函数中
  • G (Global) 全局作用域
  • B (Built-in) 内置作用域(内置函数所在模块的范围)

以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。

g_count = 0  # 全局作用域
def outer():
    o_count = 1  # 闭包函数外的函数中
    def inner():
        i_count = 2  # 局部作用域

Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问,如下代码:

if True:
    msg = 'I am from Runoob'

print(msg)

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:

total = 0  # 这是一个全局变量
# 可写函数说明
def sum(arg1, arg2):
    # 返回2个参数的和."
    total = arg1 + arg2  # total在这里是局部变量.
    print("函数内是局部变量 : ", total)
    return total
# 调用sum函数
sum(10, 20)
print("函数外是全局变量 : ", total)

global 和 nonlocal关键字

当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。

以下实例修改全局变量 num

num = 1
def fun1():
    global num  # 需要使用 global 关键字声明
    print(num)
    num = 123
    print(num)
fun1()
print(num)

如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了,如下实例:

def outer():
    num = 10
    def inner():
        nonlocal num   # nonlocal关键字声明
        num = 100
        print(num)
    inner()
    print(num)
outer()

二十八.os.walk

for roots,dirs,files in os.walk(rootdir):
    print('roots:',roots)
    print('files:',files)

rootdir为文件夹总目录,roots是整个文件夹的目录,files是文件夹下的图片目录

二十九.python处理txt

1.写txt

列表形式:

    with open(output_label_path, 'w', encoding='utf-8') as file:
        [file.write(val + '\n') for val in value_list]

2.读txt

    with open(train_label_path, 'r', encoding='utf-8') as file:
        for i,read_info in enumerate(file.readlines()):
            # if i<3:
                image_name=read_info.split(' ')[0]
                if image_name in os.listdir(train_path):
                    print('read_info:',read_info)

3.将gbk的txt转换成utf-8

import os
txt_name='./算法json-20190906+-+3(4)(1).txt'
output_path='./out'
if not os.path.exists(output_path):
    os.mkdir(output_path)

decode_res=[]
with open(txt_name, 'rb') as file:
    for read_info in file.readlines():
        # print(read_info.decode('gbk'))
        decode_res.append(read_info.decode('gbk'))

with open(output_path + '/' + txt_name.split('/')[-1], 'w', encoding='utf-8') as file:
    [file.write(val + '\n') for val in decode_res]

                               

三十.列表找交集,并集,差集

   list_a = [3,4,5,8]
	list_b = [3,4,5,6,7]
	set_c = set(list_a) & set(list_b)
	list_c = list(set_c)
	print('list_c:',list_c)
  
    #求并集
    retC = list(set(listA).union(set(listB)))
    print "retC1 is: ",retC

    #求差集,在B中但不在A中
    retD = list(set(listB).difference(set(listA)))

三十一.使用title方法,将每个单词首字母大写

s = "programming is awesome"

print(s.title())

三十二.按照指定大小切割列表

from math import ceil

def chunk(lst, size):
    return list(
        map(lambda x: lst[x * size:x * size + size],
            list(range(0, ceil(len(lst) / size)))))
res=chunk([1,2,3,4,5],2)
print('res:',res)

三十三.合并两个字典

def merge_two_dicts(a, b):
    c = a.copy()   # make a copy of a
    c.update(b)    # modify keys and values of a with the ones from b
    return c

a = { 'x': 1, 'y': 2}
b = { 'y': 3, 'z': 4}
print(merge_two_dicts(a, b))

三十四.将列表转换成字典

def to_dictionary(keys, values):
    return dict(zip(keys, values))


keys = ["a", "b", "c"]
values = [2, 3, 4]
print(to_dictionary(keys, values))

三十五.try/except +else 子句

如果没有触发错误的话,就会运行else句子。

try:
     1==0
except TypeError:
    print("An exception was raised")
else:
    print("Thank God, no exceptions were raised.")

三十六.最常出现的列表元素

def most_frequent(list):
    return max(set(list), key = list.count)

list = [1,2,1,2,3,2,1,4,2]
res=most_frequent(list)
print('res:',res)

三十七.判断是是文件夹还是文件

os.path.isdir()
os.path.isfile()

三十八.any or all

x = [True, True, False]
    if any(x):
        print("At least one True")
    if all(x):
        print("Not one False")
    if any(x) and not all(x):
        print("At least one True and one False")

三十九.time获取当前时间

import time
    print(time.localtime())
    month = time.strftime("%Y%m", time.localtime())
    print(month)
    day = time.strftime("%Y%m%d", time.localtime())
    print(day)

四十.itertools combinations得到组合

itertools模块是用于处理迭代器的工具的集合

import itertools
    friends = ['Team 1', 'Team 2', 'Team 3', 'Team 4']
    res2 = list(itertools.combinations(friends, r=2))
    print('res2:', res2)
    res3 = list(itertools.combinations(friends, r=3))
    print('res3:', res3)

四十一.得到.py的同级目录和父级目录

import os
current_path = os.path.abspath(__file__)
# print('current_path:', current_path)
# 获取当前文件的父目录
father_path = os.path.abspath(os.path.dirname(current_path) + os.path.sep + ".")

四十二.利用requests下载文件

#将传递的pdf地址进行下载
def pdf_download():
    pdf_path = 'xxx/wKhmwl4CzhyAXW-1AHtjyiVfVwc920.pdf'
    response = requests.get(pdf_path)
    pdf = response.content
    with open('./test_pdf.pdf', 'wb') as f:
        f.write(pdf)

四十三.利用requests直接发送文件

#将pdf拆成img发送给后端
def pdf_img_send():
    img_path = './test_jiekou/test.png'
    with open(img_path, "rb") as f:
        files = {"file": f} #注意这个连接 后端没有写完到时候需要换
        r = requests.post('url', files=files)
        # r.raise_for_status()
    print('r.json():', r.json())
    return r.json()

四十四.利用base64发送文件以及解析base64成图片

import json
import os
import requests
import base64
def json_send(url,dataPModel):
    # header = {"Content-type": "application/json", "Accept": "text/plain", "charset": "UTF-8"}
    header = {'Content-Type': 'application/json', 'token': 'token1'}
    # header = {'Content-Type': 'application/json','token':'WrKEkskh'}
    response = requests.post(url=url,headers = header, data=json.dumps(dataPModel))#,
                             #data=json.dumps(dataPModel))
    # print('response:', response)
    return json.loads(response.text)

def convert(o):
    if isinstance(o, np.generic):return o.item()
    raise TypeError

def xunzhenhan_test_img():
    url = 'xxxxx'
    dataPModel = {}

    img_path = './test_jiekou_img/15637681196627742_0.jpg'
    with open(img_path, "rb") as f:  # 转为二进制格式
        data_base64 = base64.b64encode(f.read()).decode()  # 使用base64进行加密
    with open('img_data_base64.txt', 'w', encoding='utf-8') as file:
        file.write(data_base64)

    dataPModel['encode_data'] = data_base64
    dataPModel['extract'] = 1
    # print("dataPModel['mode']:", dataPModel['mode'])

    result = json_send(url, dataPModel)
    print('result:', result)
    with open('result_img.json', 'w+') as fp:
        json.dump(result, fp=fp, ensure_ascii=False, default=convert, indent=4, separators=(',', ': '))
data_base64 = request.json['encode_data']
img = Image.open(io.BytesIO(base64.b64decode(data_base64)))
img = img.convert("RGB")
img = np.array(img)[..., ::-1]

四十五.判断日期是否合格

import time
def is_valid_date(date_str):
  '''判断是否是一个有效的日期字符串'''
  try:
    time.strptime(date_str, "%Y-%m-%d")
    return date_str
  except:
    return time.strftime('%Y-%m-%d', time.localtime(time.time()))
res=is_valid_date('2019-10-32')
print('res:',res)

四十六.监控GPU

class Monitor(Thread):
    def __init__(self, delay):
        super(Monitor, self).__init__()
        self.stopped = False
        self.delay = delay  # Time between calls to GPUtil
        self.run()

    def run(self):
        while not self.stopped:
            GPUtil.showUtilization()
            time.sleep(self.delay)

    def stop(self):
        self.stopped = True


# Instantiate monitor with a 10-second delay between updates
monitor = Monitor(10)

四十七.shutil操作文件夹

存在文件夹就删除

# 若文件夹不存在,创建文件夹,若存在,删除重建
def mkr(path):
    import shutil
    if os.path.exists(path):
        shutil.rmtree(path)
        os.mkdir(path)
    else:
        os.mkdir(path)

四十八.python模块collections中namedtuple(),类似c语言中的struct

from collections import namedtuple
h_fc7, h_relu5_3, h_relu4_3, h_relu3_2, h_relu2_2 = 1, 2, 3, 4, 5
vgg_outputs = namedtuple("VggOutputs", ['fc7', 'relu5_3', 'relu4_3', 'relu3_2', 'relu2_2'])
out = vgg_outputs(h_fc7, h_relu5_3, h_relu4_3, h_relu3_2, h_relu2_2)
print('==out:', out)
print('=out.fc7:', out.fc7)
for out_ in out:
    print('==out_:', out_)

四十八.python脚本调用sh清理缓存

例如:清理缓存脚本 vim cleanCache.sh

#!/bin/bash
# 每一小时清除一次缓存
echo "开始清除缓存"
sync;sync;sync #写入硬盘,防止数据丢失
sleep 10 #延迟10秒
echo 3 > /proc/sys/vm/drop_caches

python脚本

import sys
import os
import time

while 1:
    os.system('./cleanCache.sh')
    time.sleep(30*60)

四十九.生成字符画

import cv2
str = 'mqpka89045321@#$%^&*()_=||||}'# 字符表
im = cv2.imread('111.png')    # 读取图像
grey = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)    # 灰度转换
grey = cv2.resize(grey, (50, 18))    # 缩小图像
img_h, img_w = grey.shape
str_img = ''    # 用于装字符画
for i in range(img_h):
    for j in range(img_w):
        index = int(grey[i, j] / 256 * len(str))  # 获取字符坐标
        str_img += str[index]  # 将字符添加到字符画中
    str_img += '\n'
print(str_img)

五十.python的一些类方法

1.实例方法

最常见的一种方法,参数名一般为self,通过它来传递实例的属性和方法,(也可以传类的属性和方法),调用时只能由实例对象调用。

2.call方法

类实例化时进行自动调用,类似函数调用

class Reader:
    def __init__(self, name, nationality):
        self.name = name
        self.nationality = nationality

    def __call__(self, age):
        print('姓名:{},国籍:{},年龄:{}' .format(self.name, self.nationality, age))

r = Reader('Annie','中国')
r('18')

3.类方法

使用装饰器@classmethod修饰,参数名一般cls,通过它来传递类属性和方法,不能传递实例的属性和方法,调用是类和实例对象都能调用


class ClassTest(object):
    __num = 0

    @classmethod
    def addNum(cls):
        cls.__num += 1

    @classmethod
    def getNum(cls):
        return cls.__num

    # 这里我用到魔术方法__new__,主要是为了在创建实例的时候调用累加方法。
    def __new__(self):
        ClassTest.addNum()
        return super(ClassTest, self).__new__(self)


class Student(ClassTest):
    def __init__(self):
        self.name = ''

a = Student()
b = Student()
print(ClassTest.getNum())

4.静态方法

使用装饰器@staticmethod修饰,静态方法是类中的函数。可以理解为,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。调用是类和实例对象都能调用


import time

class TimeTest(object):
    def __init__(self, hour, minute, second):
        self.hour = hour
        self.minute = minute
        self.second = second

    @staticmethod
    def showTime():
        return time.strftime("%H:%M:%S", time.localtime())


print('==TimeTest.showTime():', TimeTest.showTime())

time.sleep(2)
t = TimeTest(2, 10, 10)
nowTime = t.showTime()
print('==nowTime:', nowTime)

五十一.python的一些魔法方法

1.__doc__方法

class Solution:
    def answer(self, what):
        self.what = what

s = Solution()
print('==Solution.__doc__:', Solution.__doc__)       #表示类的描述信息
print('==s.__module__:', s.__module__) #表示当前操作的对象在那个模块
print('==s.__class__:', s.__class__)   #表示当前操作的对象的类是什么

2.__dict__方法

类或者对象的所有属性

class Solution:
    def __init__(self, what):
        self.what = what
    # def answer(self, what):
    #     self.what = what

s = Solution("hha")
print('===Solution.__dict__:', Solution.__dict__)
print('===s.__dict__:', s.__dict__)

3.__init__()与__new__()方法

__new__() 创建对象时调用,会返回当前对象的一个实例

__init__() 创建完对象后调用,对当前对象的一些实例进行初始化

class Solution:
    def __init__(self, what):
        print('__init__() called')
        print('==init what', what)
    def __new__(cls, *args, **kwargs):
        print('__new__() called')
        print('==cls:', cls)
        print('==args:', args)
        print('==kwargs:', kwargs)
        return super().__new__(cls)

s = Solution(what="hahah")

4.__call__方法

类实例化时进行自动调用,类似函数调用

class Reader:
    def __init__(self, name, nationality):
        self.name = name
        self.nationality = nationality

    def __call__(self, age):
        print('姓名:{},国籍:{},年龄:{}' .format(self.name, self.nationality, age))

r = Reader('Annie','中国')
r('18')

5.__str__方法

如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

class Solution:
    def __init__(self, what):
        self.what = what
    def __str__(self):
        return '===打印对象时,就打印这里的值'

s = Solution("hha")
print('==s:', s)

class Solution:
    def __init__(self, what):
        self.what = what
    # def __str__(self):
    #     return '===打印对象时,就打印这里的值'

s = Solution("hha")
print('==s:', s)

6.用于索引操作,如字典。

用于切片操作,如列表。

6.1用于字典


class MyDict:

    def __init__(self):
        self.my_dict = dict()

    def __getitem__(self, key):
        print('调用__getitem__():', key)
        print('==self.my_dict:', self.my_dict)
        return self.my_dict.get(key, None)

    def __setitem__(self, key, value):
        print('调用__setitem__():', key, value)
        self.my_dict[key] = value

    def __delitem__(self, key):
        print('调用__delitem__():', key)
        del self.my_dict[key]

mydict = MyDict()
print("===mydict['name']===", mydict['name'])  #调用__getitem__方法
mydict['name'] = 'Damin'  #调用__setitem__方法
mydict['age'] = '12' #调用__setitem__方法
print("===mydict['name']===", mydict['name'])  #调用__getitem__方法
print("===mydict['age']===", mydict['age'])  #调用__getitem__方法
del mydict['name']
print("===mydict['name']===", mydict['name'])  #调用__getitem__方法

6.2用于列表


class MyList(object):

    def __init__(self):
        self.mlist = list()

    def __getitem__(self, index):
        print('__getitem__() called:')
        if isinstance(index, slice):
            return self.mlist[index]

    def __setitem__(self, index, value):
        print('__getitem__() called:')
        print(index, value)
        if isinstance(index, slice):
            self.mlist[index] = value

    def __delitem__(self, index):
        print('__delitem__()called:')
        if isinstance(index, slice):
            del self.mlist[index]

mlist =  MyList()

mlist[:] = [1, 2, 3]
print('==mlist[:2]:', mlist[:2])

五十一.datetime使用

today = datetime.date.today()
pre_day = today - datetime.timedelta(days=12)#往前推12天
print('==today:', today)
print('==pre_day:', pre_day)
dir_time = datetime.date(2020, 7, 3)
print('==dir_time:', dir_time)

if dir_time > pre_day and dir_time < today:
    print('在这12天中!!!!')

五十二.eval函数

def hah(a, b):
    print(a+b)

loss_name = 'hah'
kwargs = {'a': 3, 'b': 4}
eval(loss_name)(**kwargs)

五十三.find方法

find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1。

五十四.types.MethodType函数的用法分析

MethodType函数可以将外部函数绑到一个类和实例中。

1.绑定到实例中

from types import MethodType

class Student(object):
    pass


def set_score(self, score):
    self.score = score


s1 = Student()
s2 = Student()

s1.set_score = MethodType(set_score, s1) #把外部函数绑到实例s1中
s1.set_score(99)
print('==s1.score:', s1.score)
print('==s2.score', s2.score)

可看出只绑定了s1,故s2调用会报错

2.绑定到类中


from types import MethodType

class Student(object):
    pass


def set_score(self, score):
    self.score = score
s1 = Student()
s2 = Student()

Student.set_score = MethodType(set_score, Student)
Student.set_score(99)
print('==Student.score:', Student.score)
print('==s1.score:', s1.score)
print('=s2.score:', s2.score)

s1.set_score(88)
print('==Student.score:', Student.score)
print('==s1.score:', s1.score)
print('=s2.score:', s2.score)

s2.set_score(77)
print('==Student.score:', Student.score)
print('==s1.score:', s1.score)
print('=s2.score:', s2.score)

可看出等效成为了类方法,实例化的对象都能取到值。

五十五.post请求二进制

    pid = 'yf6yuy6y6dgy'
    img_path = './test_jiekou/test.png'
    import time
    start_time = time.time()
    with open(img_path, "rb") as f:
        files = {"file": f}#注意这块url到时候和后端联调需要换掉
        r = requests.post('http://ip:port/file/upload?pId={}'.format(pid), files=files)

五十六.下载二进制

    pdf_path = 'http://ip:port/group1/M00/00/00/wKhmwl4CzhyAXW-1AHtjyiVfVwc920.pdf'
    response = requests.get(pdf_path)
    pdf = response.content
    with open('./test_pdf.pdf', 'wb') as f:
        f.write(pdf)

五十七.partial


from functools import partial

def multi_apply(func, *args, **kwargs):
    """Apply function to a list of arguments.

    Note:
        This function applies the ``func`` to multiple inputs and
        map the multiple outputs of the ``func`` into different
        list. Each list contains the same type of outputs corresponding
        to different inputs.

    Args:
        func (Function): A function that will be applied to a list of
            arguments

    Returns:
        tuple(list): A tuple containing multiple list, each list contains \
            a kind of returned results by the function
    """
    # print('=*args:', *args) #[1, 2, 3] [2, 3, 4]
    # print('=kwargs:', kwargs) #{'z': 10}
    # 注册入默认参数z = 10
    pfunc = partial(func, **kwargs) if kwargs else func
    map_results = map(pfunc, *args)
    #*map_results  (20, 30) (60, 50) (120, 70) 解压可迭代对象
    #list(zip(*map_results)) [(20, 60, 120), (30, 50, 70)]
    return tuple(map(list, zip(*map_results)))#([20, 60, 120], [30, 50, 70])

def multiply(x, y, z):
    return x * y * z, x + y + z

a = [1, 2, 3]
b = [2, 3, 4]

res = multi_apply(multiply, a, b, z=10)
print('=res:', res)

五十八:快速搭建ftp服务器

共享ftp

# python2
python -m SimpleHTTPServer 8888
# python3
python3 -m http.server 8888

五十九.python -i 出问题即可调试

from functools import lru_cache
@lru_cache(None)
def add(x, y):
    print("calculating: %s + %s" % (x, y))
    return x / y
print(add(1, 2))
print(add(1, 2))
print(add(2, 3))
print(add(2, 0))

输入 import pdb;pdb.pm() 即可开始调试,就不需要出问题了,在输入import pdb;pdb.set_trace()在重新执行程序. 

六十.pretty-errors 出错显示彩色信息

pip install pretty-errors

python  -m pretty_errors
 

六十一.python 调用shell命令

import os
def main():
    path = './cache/result_videos_track_multiframe_keypoint_box_euro_11_17_frame5'
    videos_list_path = [os.path.join(path, i) for i in os.listdir(path)]
    for i, video_list_path in enumerate(videos_list_path):
        print(video_list_path)
        name = path.split('/')[-1].split('_')[-1]
        output_path = video_list_path+name+'ffmpeg.mp4'
        cmd = """ffmpeg -i {} -crf 27 -filter:v "setpts=0.5*PTS" -vcodec h264 {}""".format(video_list_path, output_path)
        # print('==cmd:', cmd)
        rst = os.popen(cmd).read()
        # """ffmpeg -i $1 -crf 27 -filter:v "setpts=0.25*PTS" -vcodec h264 $2"""
if __name__ == '__main__':
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值