Python有关函数的详解锦集

Posted 你们的小小磊哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python有关函数的详解锦集相关的知识,希望对你有一定的参考价值。

Python有关函数的详解锦集

1、python之文件读写详解

with open(filename, 'r', encoding = 'utf-8') as infile:
  • 打开文件——函数open()
参数说明
file:文件路径
mode:文件的读写方式,默认‘r’,只读方式;
buffering:设置缓冲策略,0用于二进制文件,1为行缓冲,用于文本模式;默认二进制文件固定大小缓冲,文本文件行缓冲
encoding:设置编码,默认utf-8;该参数不能用于二进制模式;
errors:设置怎么处理文件的编码异常,默认strict,发生错误抛出异常;设置ignore忽略编码异常,可能导致数据丢失,这个参数不能用于二进制模式;
newline:设置换行符,默认换行符为‘\\n‘,‘\\r‘,‘\\r\\n‘,写入文件的时候,所有文本中的上述三种都会转换成‘\\n‘换行符;当设置为‘‘时,也启用默认模式;如果设置其它合法值,则使用其他值,一般不用;
closefd=True :设置文件描述符的状态,当为False时,文件关闭但描述符不关闭,但是打开文件时指定了文件名,那么设置False不会起作用。
参数说明
r:以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
w:打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a:打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
x:创建一个新文件,将其打开并编写;如果文件已经存在报错;
rb:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
wb:以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
r+:打开一个文件用于读写。文件指针将会放在文件的开头。
w+:打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a+:打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
rb+:以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
wb+:以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab+:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
  • 关闭文件 ——close()
    f = open(file)
    f.close()

1、文件普通读

  • 方法一:read() 把读取的文件名直接命名变量f

    with open(filename) as f:

    f.read() # 一次性读取全部,在大文件这是不可取的

    f.read(5) # 读取5个字节,如果使用UTF-8编码,5表示5个汉字,也表示5个字母。

    f.read(6) # 同一个f对象,多次读取时在上一次的基础上继续往下,如果超过则有多少读多少

  • 方法二:readline()

    with open(filename) as f:

    f.readline() # 按行来读取,每次返回一行,

    f.readline() # 多次读取在上一行的基础上往下,换行符也会被读取

  • 方法三:readlines()

    with open(filename) as f:

    t = f.readlines() # 按行读取全部的内容作为一个列表返回

    readable()方法可以用来判断文件是否可读

2、文件普通写

  • 方法一:write()

    with open(filename,‘w‘,encoding=‘utf-8‘) as f:

    t = f.write(‘ddd‘) # 将内容写入,必须是字符串格式,不可以是数字,返回的是字符串的个数,包括了换行符\\r\\n占两个字符(windows),占一个字符\\n(linux)。

    t = f.write(‘aaa‘) # 多次写入在原来的基础上继续写入

  • 方法二:writelines()

    with open(filename,‘w‘,encoding=‘utf-8‘) as f:

    f.writelines([‘aa‘,‘bb‘]) # 该方法自动将列表元素拼接起来写入文件,参数时一个可迭代对象,列表、字典、集合都可以

    writeable()可以判断打开的文件对象f究竟是可读的还是可写的。

  • 注意的问题

    f.write(123) 这种是不被允许的,必须转化成二进制或字符串;

    open(filename,‘rb‘,encoding=‘utf-8‘) : 以二进制格式打开文件是不能指定编码的,否则报错

    以二进制格式打开文件,写入的必须是字节文件,同时写入返回的是字节数;以文本模式打开,写入的必须是文本,同时返回的是字符串个数;一个汉字字符串占3个字节。

2、map()函数的使用

 self.vectors.append(np.array(list(map(float, line.strip().split(' '))), dtype = np.float32))
  • map()函数的原型是map(function,iterable,……),它的结果是返回一个列表,这个函数的意义是将function应用于iterable的每一个元素,结果以列表的形式返回
  • 1、参数function是一个函数名,是一种功能,为实现我们一些要求的转换,可以是python内置的,比如int,将值整型化,还可以是自定义的
  • function是内置的,这里举例 int/str
a=[3.7,4,5]
b=list(map(int,a))
c=list(map(str, a))
print(b)
print(c)
输出:
[3, 4, 5]
['3.7', '4', '5']

  • function是自定义的,这里举例实现数字的平方
def sum(x):
  return x**2
m=(1,2,3)
print(list(map(sum,m)))
输出:[1, 4, 9]
  • 2、参数iterable是一个可以迭代的对象,例如列表,元组,字典等

  • map()函数的注意事项、常见错误

  • 1、版本注意的地方

   在python3.x版本里面,map()的返回值是iterators,而不是list, 所以想要使用,需将iterator 转换成list ,而在python2.x版本里,
   map()是直接返回list关于python()函数中常见的错误如下所示:我这里使用的是python3.x的版本

a=[3.7,4,5]
b=map(int,a)
print(b)
还是上面的代码,但是map()前面我删除了list

结果报错如下所示:
<map object at 0x00000231F8C674E0>

  • 2、当参数function没有返回值return时,直接返回成None或者没有任何返回值
    • (1)有pass语句
def sum(x):
   pass

m=(1,2,3)
print(list(map(sum,m)))
结果:
[None, None, None]

Process finished with exit code 0

    • (2)没有pass、return语句,没有任何返回值
def sum(x):

m=(1,2,3)
print(list(map(sum,m)))

结果:
Process finished with exit code 0
  • 当处理两个并行的list时候,注意两个list的类型和数量相同
def add(x,y,z):
    return x,y,z
a=(1,2,3,4)
b=(1,2,3)
c=(1,2,3,4,5)
m=list(map(add,a,b,c))
print(m)
结果
[(1, 1, 1), (2, 2, 2), (3, 3, 3)]

3、np.array()函数的使用

  • 将列表list或元组tuple转换为 ndarray 数组。
  • 这样做的目的是可以节省电脑的空间,python中的list本质是一个对象,很难放下,因此需要转换。
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
属性含义
object:列表、元组等。
dtype:数据类型。如果未给出,则类型为被保存对象所需的最小类型。
copy:布尔来写,默认 True,表示复制对象。
order:顺序。
subok:布尔类型,表示子类是否被传递。
ndmin:生成的数组应具有的最小维数。

4、line.strip().split(’ ')函数的使用

  • ls = line.strip(’\\n’).split(’,’)
    strip() 方法用于移除字符串头尾指定的字符(默认为空格)。
    line.strip(’\\n’) 移除换行符并返回列表。
    split()通过指定分隔符对字符串进行切片。
    line.strip(’\\n’).split(’,’) 通过逗号进行切片。

5、append()函数详解

  • 1、append() 函数可以向列表末尾添加元素
    list.append( element ) element:任何类型的元素
name_list = ['zhangsan', 'lisi', 'wangwu']
name_list.append('zhaoliu')
print(name_list)
输出:
['zhangsan', 'lisi', 'wangwu', 'zhaoliu']

# append() 函数可以向列表末尾添加「任意类型」的元素
添加普通类型(数值、字符串)元素
list1 = ['zhangsan', 'lisi', 'wangwu']
list1.append(1)  # 添加整形
print(list1)
list1.append('str')  # 添加字符型
print(list1)
输出:
['zhangsan', 'lisi', 'wangwu', 1]
['zhangsan', 'lisi', 'wangwu', 1, 'str']

添加集合类型(列表,元祖)元素
list1 = ['zhangsan']
list1.append([1,2,3])  # 添加列表
print(list1)
list1.append((4,5,6))  # 添加元祖
print(list1)
输出:
['zhangsan', [1, 2, 3]]
['zhangsan', [1, 2, 3], (4, 5, 6)]

需要注意的是, append() 函数添加的元素在列表的「末尾」而不是任意位置

  • 2、列表同步
    使用 append() 函数添加列表时,是添加列表的「引用地址」而不是添加列表内容,当被添加的列表发生变化时,添加后的列表也会同步发生变化。
list1 = ['zhangsan']
a = [1,2,3]
list1.append(a)  # 列表list1添加列表a
print(list1)
a.append(4)  # 列表a发生变化
list1.append(a)
print(list1)  # 列表list1也会同步变化
输出:
['zhangsan', [1, 2, 3]]
['zhangsan', [1, 2, 3, 4], [1, 2, 3, 4]]

  • 3、append()与extend()的区别
    append添加的是元素本身,而extend添加的是元素的值
    append可以添加所有类型元素,而extend只能添加序列
//比如,添加列表时,append会添加整个列表,而extend只会添加列表中的值
list1 = ['zhangsan', 'lisi', 'wangwu']
list2 = ['zhangsan', 'lisi', 'wangwu']
list1.append([1,2,3])
print('append添加整个列表:', list1)
list2.extend([1,2,3])
print('extend添加列表的值:', list2)
//shuchu
append添加整个列表: ['zhangsan', 'lisi', 'wangwu', [1, 2, 3]]
extend添加列表的值: ['zhangsan', 'lisi', 'wangwu', 1, 2, 3]

6、assert() 断言函数详解

  • 使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单。在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃,这时候就需要assert断言的帮助。本文主要是讲 assert 断言的基础知识
  • python assert断言的作用
    python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。
  • assert断言语句的语法格式
    1、assert 语句用来声明某个条件是真的。
    2、如果你非常确信某个你使用的列表中至少有一个元素,而你想要检验这一点,并且在它非真的时候引发一个错误,那么 assert 语句是应用在这种情形下的理想语句。
    3、当 assert 语句失败的时候,会引发一 AssertionError。

7、字典添加详解

distance = 
distance[(idx1, idx2)] = dis  //添加字典的属性;
del distance[(idx1, idx2)]  //删除字典属性;

8、[1 for value in distance.values() if value < dc ] 详解

dc=0.616
distance=(1,2):0.01,(2,1):0.01,(1,3):0.7,(1,4):0.04,(1,5):0.9
[1 for value in distance.values() if value < dc]
Out[7]: [1, 1, 1]
[4 for value in distance.values() if value < dc]
Out[8]: [4, 4, 4]
a=[1 for value in distance.values() if value < dc ]
type(a)
Out[10]: list
type(distance.values())
Out[12]: dict_values

9、lambda表达式

  • lambda函数介绍
    语法:lambda 参数列表:lambda体
    lambda是关键字声明,在lambda表达式中,参数列表与函数中的参数列表一样,但不需要用小括号括起来,冒号后面是lambda体,lambda表达式的主要代码在lambda体处编写,类似于函数体。

提示: lambda体不能是一个代码块,不能包含多条语句,只能包含一条语句,该语句会计算一个结果返回给lambda表达式,但与函数不同的是,不需要使用return语句返回,而且当使用函数作为参数的时候。lambda表达式非常有用,可以让代码简洁,简单。

  • 2、lambda函数与def函数的区别
    1.lambda可以立即传递(无需变量),自行返回结果
    2.lambda在内部只能包含一行代码
    3.lambda是一个为编写简单函数而设计的,而def用来处理更大的任务
    4.lambda可以定义一个匿名函数,而def定义的函数必须有一个名字
  • lambda函数的优势:
    1.对于单行函数,使用lambda表达式可以省去定义函数的过程,让代码更加简洁
    2.对于不需要多次复用的函数,用lambda表达式可以在用完后立即释放,提高程序执行的性能。
gauss_func = lambda dij, dc : math.exp(- (dij / dc) ** 2)

10、math.exp()方法的语法

    Input:
    a = 111.111
 
    # function call
    print(math.exp(a))
 
    Output:
    1.7984326512709283e+48

语法:    math.exp(n)
参数: n-整数或浮点数。
返回值: float –它返回一个浮点数,该浮点数是数字n的指数形式。




--------------------------------------python之文件读写详解下面待学待更新------------------------------------

  • 普通字符串转化为字节文件的方法:

    b‘123adf‘:这种方法只能针对数字和字母,默认使用ascii编码,不能转化汉字;

    ‘123adf‘.encode(‘utf-8):可以转化字母和汉字;

    bytes(‘我的‘,encoding=‘utf-8‘):可以转化字母和汉字,但必须 指定编码格式;

  • 文件的定位读写

    tell():获取文件指针的位置

    with open(filename,‘r‘,encoding=‘utf-8‘) as f:

    f.read(3)

    t = f.tell() # 获取指针的位置,返回3,如果读取到换行符,换行符在windows占两个字节

    seek(offset,from):设置指针的位置

参数

offset:偏移量,设置负数表示向前偏移,正数表示向后偏移,一个汉字占3个字节,字母占一个字节

from:偏移的方向

0:表示文件开头

1:表示当前位置

2:表示文件末尾

with open(filename,‘r‘,encoding=‘utf-8‘) as f:

f.read(3)

a = f.seek(0,0) # 返回指针定位后的实际位置,默认偏移方向从文件开头算起

注意

在文本模式下打开文件,偏移方向只能从文件开头算起,参数from只能为0,这是因为文本模式涉及到编码的问题,以二进制格式打开文件就可以设置不同的方向。

每次打开文件,读操作的指针都是在文件的开头,写操作的指针在文件的末尾,直到文件被关闭;

几个经典的案例

文件同时读写的情况

with open(‘test.txt‘, ‘r+‘) as f:

print(f.tell()) # 当前指针的位置在开头0

a = f.read(3) # 指针到了位置3

print(a)

print(f.tell())

h = f.write(‘hhh‘) # 从文件的末尾写入,相当于追加数据

print(h)

c = f.tell() # 指针在文件的末尾

print©

print(f.read()) # 读取从位置3到文件原来的末尾的数据

print(f.tell()) # 当前位置在新的文件末尾和c相同

总结:r+模式下,如果同一个文件对象需要读和写,读和写各有一个指针,它们是相互独立的,读写位置各不干扰;但是tell函数获取到的位置优先表示写的位置;即当程序执行时,如果只有读,tell获取的位置是读的位置;如果出现了写,tell获取的位置就一定是写的位置了,无论后面还有没有更多的读操作;同理其他的模式也一样;

文件同时读写存在偏移的情况

with open(‘test.txt‘, ‘r+‘) as f:

print(f.tell()) # 当前读指针的位置在开头0,写指针还未初始化

print(f.read(3)) # 读指针到了位置3

print(f.tell()) # 获取到读指针的位置为3

f.seek(0) # 指针偏移到文件的开头,只能影响一个指针

print(f.read(3)) # 读指针到了位置3

h = f.write(‘gggg‘) # 增加一个文件描述符,写指针初始化到文件的末尾,写入数据

j = f.tell() # 获取写的位置优先,写指针在文件末尾

print(j)

f.seek(0) # 指针偏移到文件的开头,读文件的数据更新,加入了写入的数据

j = f.tell() # 获取写指针在文件的开头

print(j)

h = f.write(‘vvvv‘) # 从文件开头写入数据,覆盖原来的数据

c = f.tell() # 获取写指针在文件的位置4

print©

print(f.read(4)) # 读取从位置4往后的4个字符

print(f.tell()) # 读指针在文件8位置

h = f.write(‘xxx‘) # 从文件的末尾写入,相当于追加数据

print(f.tell()) # 当前位置在新的文件末尾

print(f.read()) # 从8位置读取所有的数据

总结:

seek()函数只能影响它下面的第一次的读写操作;并且会将上一次写入的数据更新到读缓冲区中;

在r+模式下,write()总是从文件的末尾写入,除非受seek函数的影响;

write()操作被偏移影响后,其后的read操作的指针会被移到write操作的位置;

文件同时读写存在且存在更新的情况

with open(‘test.txt‘, ‘r+‘) as f:

f.read()

f.seek(2,0) # 定位到到文件的开头往右2的位置

f.truncate() # 将2位置后所有的数据删除

f.write(‘aaa‘) # 写入新的数据

truncate():动态删除数据,从当前指针删除后面所有的数据

其他方法

flush():刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入,一般close()函数时先调用flush(),然后再关闭文件描述符。

fileno:返回一个整型的文件描述符,很少用到;

isatty():文件是否连接到一个终端的设备;

truncate():文件截取,无参数时从当前的指针位置删除后面所有;有参数时从首行首字母截取数据留下来,其余的删除;

以上是关于Python有关函数的详解锦集的主要内容,如果未能解决你的问题,请参考以下文章

Selenim Webdriver Python3源码分析系列锦集

Python案例详解Python文件迭代的方法

python开发笔记之zip()函数用法详解

Python 编程规范指南详解 上

Python介绍

Python学习之函数详解