【python 个人使用易错点记录】

1.Python copyfile 、copy的使用区别

copyfile(src, dst) #src, dst 都需是文件名, 如果dst 存在或无权限,会抛出异常
copy(src, dst) #dst 可以是目录名。

shutil.copyfile( src, dst) 从源src复制到dst中去,当然前提是目标地址是具备可写权限,抛出的异常信息为IOException.。

如果当前的dst已存在的话就会被覆盖掉shutil.move( src, dst) 移动文件或重命名,shutil.copymode( src, dst) 只是会复制其权限其他的东西是不会被复制的,shutil.copystat( src, dst) 复制权限、最后访问时间、最后修改时间,shutil.copy( src, dst) 复制一个文件到一个文件或一个目录,shutil.copy2( src, dst) 在copy上的基础上再复制文件最后访问时间与修改时间也复制过来了,类似于cp –p的东西

shutil.copy2( src, dst) 如果两个位置的文件系统是一样的话相当于是rename操作,只是改名;如果是不在相同的文件系统的话就是做move操作,shutil.copytree( olddir, newdir, True/Flase),把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接,shutil.rmtree( src ) 递归删除一个目录以及目录内的所有内容

2. 多种类图像识别数据处理的时候,标签转化为独热编码

np_utils.to_categorical
np_utils.to_categorical用于将标签转化为形如(nb_samples, nb_classes)的二值序列。
假设num_classes = 10。
如将[1,2,3,……4]转化成:
[[0,1,0,0,0,0,0,0]
[0,0,1,0,0,0,0,0]
[0,0,0,1,0,0,0,0]
……
[0,0,0,0,1,0,0,0]]
这样的形态。
如将Y_train转化为二值序列,可以用如下方式

3. Python 二维列表遍历方法:

https://www.cnblogs.com/cloud-ken/p/10019253.html

4. 生成器的使用方法

生成器是python语法中特别重要的语法,python之所以天生适合处理大数据类的问题,就是因为有生成器等这些语法存在。
对于一个很大的列表,如果我们直接用列表生成式的话,会占用很大的内存空间。

s = [i**2 for i in range(100000000000000000)]

这样的语法,往往利用率很低,所以我们需要用到生成器generator用法,

s = (i**2 for i in range(100000000000000000))

这样我们每次next(s)是就分配一个内存空间,而不是一次性分配所有的内存空间。
上面就是生成器最简单的使用方法之一

使用生成器的第二种方法:将函数定义成生成器,如果一个函数定义中包含yield关键字,那么这个函数就不是一个普通函数,而是一个生成器。

生成器和函数的执行流程不一样,函数是顺序执行,遇到return语句或者最后一行函数语句就返回,而变成生成器的函数,再每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

def odd():
    print('step 1')
    yield 1
    print('step 2')
    yield(3)
    print('step 3')
    yield(5)

调用该生成器时,首先要生成一个生成器对象,然后用**next()**函数不断获得下一个返回值:

>>> o = odd()
>>> next(o)
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
>>> next(o)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

可以看到, odd不是普通函数,而是生成器,在执行过程中,遇到yield就中断,下次又继续执行。执行3次yield后,已经没有yield可以执行了,所以,第4次调用**next(o)**就报错。

把函数改成generator后,我们基本上从来不用**next()**来获取下一个返回值,而是直接使用for循环迭代:

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'
>>> for n in fib(6):
...     print(n)
...
1
1
2
3
5
8

但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的值中:

>>> g = fib(6)
>>> while True:
...     try:
...         x = next(g)
...         print('g:', x)
...     except StopIteration as e:
...         print('Generator return value:', e.value)
...         break
...
g: 1
g: 1
g: 2
g: 3
g: 5
g: 8
Generator return value: done

参考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017318207388128

习题:
在这里插入图片描述

def myeven(max):
    n = 0
    while n<= max:
        if n % 2 == 0:
            yield n
        n = n+1
            
n=eval(input())

s =[str(i) for i in myeven(n)]
ans = ','.join(s)
print(ans)
def EvenGenerator(n):
    i = 0
    while i <= n:
        if i % 2 == 0:
            yield i
        i += 1


n = int(raw_input())
values = []
for i in EvenGenerator(n):
    values.append(str(i))

print ",".join(values)

5.变量命名规则 驼峰命名法

小驼峰法
变量一般用小驼峰法标识。驼峰法的意思是:除第一个单词之外,其他单词首字母大写。譬如
int myStudentCount;
变量myStudentCount第一个单词是全部小写,后面的单词首字母大写。
大驼峰法
相比小驼峰法,大驼峰法(即帕斯卡命名法)把第一个单词的首字母也大写了。常用于 类名,命名空间等。譬如
public class DataBaseUser;

Guess you like

Origin blog.csdn.net/jackhh1/article/details/112100926