python里面有哪些自带函数?

- 使用内置函数时注意需要导入

- (ceil)向上取整,返回取整数

# 向上取整,返回向上取整的数

# 向下取整,返回一个向下取整的数

- (keyword)保留系统关键字,不要和关键字重名

# 查看当前系统保留关键字,不要和关键字重名

# 四舍五入,返回一个整数`

# 开方,返回平方浮点数

- (pow)幂运算,返回整数

# 幂运算,返回x,y几次方的结果

- (fabs)返回浮点型的绝对值

# 返回浮点型的绝对值

- (abs)系统自带的函数,返回整数绝对值

# 系统自带的绝对值,返回自己定义类型的数的绝对值

- (fsum)返回可迭代的浮点型总和

# 求和,返回一个可迭代的总和浮点数

- (sum)系统自带求和,返回自定义总和

# 求和,返回一个可迭代的总和类型根据自己定义

- (modf)将整数和小数分开,返回第一个小数,第二个整数

# 将整数和小数分开,返回第一个是小数,第二个是整数,都是带有浮点数

- (copysign)将第二个数符号传给第一个数,返回第一个数

# 将第二个数的符号传给第一个数,以浮点数形式返回第一个数浮点型

# 获取0到1之间的数,返回0到1之间数

- (randint)指定整数范围内随机,返回随机整数

# 在指定整数之间随机,返回随机整数

- (randrange)指定范围内随机,可以设置间隔距离,返回随机数

# 指定范围内随机,也可以说设置间隔距离,返回随机数

- (choice)在指定的列表中随机,返回随机数

# 在指定列表内随机,返回随机值

# 指定列表进行打乱,返回None

- (uniform)指定范围内随机,返回浮点型随机

# 指定范围内随机数,返回浮点数

1.函数的不固定参数: #参数不是必填的.没有限制参数的个数.返回参数组的元组 def syz(*args): #参数组,不限制参数个数 #‘args’参数的名字可以随便命名 print(args) ...

python 内置函数和函数装饰器

Python之所以特别的简单就是因为有很多的内置函数是在你的程序"运行之前"就已经帮你运行好了,所以,可以用这个的特性简化很多的步骤.这也是让Python语言变得特别的简单的原因之 ...

【转】python 内置函数总结(大部分)

python内置函数详细介绍

这题应该是用dp来做的吧,但一时不想思考了,写了个很暴力的,类似模拟打表,然后排序即可,要注意的是输出的格式,在这里wa了一发,看了别人的代码才知道哪些情况没考虑到. #include

按规则移动机器人 , 问是否能拾得宝藏 . 加了一个控制板 , 还增加了一个控制板移动周期 p 将移动周期变换一下 , 移动一次  就相当于光标向左不耗费时间的移动了一格 搜索思路 : 搜索当前格子到 ...

本节解说 运营商应用 Java 算被分成: 算术运算符 颂值运营商 逻辑运算符 位运算符 元运算符 这里录制了 视频解说这几大类运算符,并有练习题提供大家 面试题: 1. 最有效率的方式算出2乘以8等 ...

c# List根据某个属性进行分类,变成以属性名称作为分类的多个List

在平时的开发中,我们从数据库中得到List列表,但是我们希望可以根据属性名称再次进行分类. 其实LINQ中已经内置相应的算法. 长话短说,直接上代码: var dataList = JsonHelpe ...

java小白之面向对象

面向对象 面相对象(oop)和面向过程(pop)通常一起说,一个是更加关注过程,事力亲为,而面向对象更加注重结果,所以说,面向对象更加是一种思想,它贯穿整个java,以上帝视角来看整个功能需求,简化开 ...

从介绍Django快开始,我们就一直在使用FBV的方式来撰写代码,二者本质上并没有太大的区别,然而到了REST framework,更会倾向于用CBV来写API的视图,后面会看到这个方式的强大,它允许 ...

本篇内容主要讲解“为什么Python自带的Print函数会报错”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“为什么Python自带的Print函数会报错”吧!

最近用 Python 写了几个简单的脚本来处理一些数据,因为只是简单功能所以我就直接使用 print 来打印日志。

任务运行时偶尔会出现一些异常:

因为我在不同地方都有打印日志,导致每次报错的地方都不太一样,从而导致程序运行结果非常诡异;有时候是这段代码没有运行,下一次就可能是另外一段代码没有触发。

虽说当时有注意到 Broken pipe 这个关键异常,但没有特别在意,因为代码中也有一些发送 http 请求的地方,一直以为是网络 IO  出现了问题,压根没往 print 这个最基本的打印函数上思考??。

直到这个问题反复出现我才认真看了这个异常,定睛一看 print 不也是 IO 操作嘛,难道真的是自带的 print 函数都出问题了?

但在本地、测试环境我运行无数次也没能发现异常;于是我找运维拿到了线上的运行方式。

原来为了方便维护大家提交上来的脚本任务,运维自己有维护一个统一的脚本,在这个脚本中使用:

来触发任务,这也是与我在本地、开发环境的唯一区别。

为此我在开发环境模拟出了异常:

等待 20s 必然会复现这个异常:

为什么会出现这个异常呢?

根据官方文档的解释,该函数会执行 fork 一个子进程执行 command 这个命令,同时将子进程的标准输出通过管道连接到父进程;

也就该方法返回的文件描述符。

这里画个图能更好地理解其中的原理:

在这里的使用场景中并没有获取 popen() 的返回值,所以 command 的执行本质上是异步的;

也就是说当 task.py 执行完毕后会自动关闭读取端的管道。

如图所示,关闭之后子进程会向 pipe 中输出 print  ',由于这里输出的内容较多会一下子填满管道的缓冲区;

从维基百科中我们也可以看出这个异常产生的一些条件:

既然知道了问题原因,那解决起来就比较简单了,主要有以下几个方案:

使用 read() 函数读取管道中的数据,全部读取之后再关闭。

如果不需要子进程中的输出时,也可以将 command 的标准输出重定向到 /dev/null。

这里使用第一种方案进行演示:

运行 task.py 之后不会再抛异常,同时也将 command 的输出打印出来。

线上修复时我没有采用这个方案,为了方便查看日志,还是使用标准的日志框架将日志输出到了 es 中,方便统一在 kibana 中进行查看。

由于日志框架并没有使用到管道,所以自然也不会有这个问题。

问题虽然是解决了,其中还是涉及到了一些咱们平时不太注意的知识点,这次我们就来一起回顾一下。

首先是父子进程的内容,这个在 c/c++/python 中比较常见,在 Java/golang 中直接使用多线程、协程会更多一些。

比如这次提到的 Python 中的 os.popen() 就是创建了一个子进程,既然是子进程那肯定是需要和父进程进行通信才能达到协同工作的目的。

很容易想到,父子进程之间可以通过上文提到的管道(匿名管道)来进行通信。

还是以刚才的 Python 程序为例,当运行 task.py 后会生成两个进程:

分别进入这两个程序的/proc/pid/fd 目录可以看到这两个进程所打开的文件描述符。

可以看到子进程的标准输出与父进程关联,也就是 popen() 所返回的那个文件描述符。

还有一点需要注意的是,当我们在父进程中打开的文件描述符,子进程也会继承过去;

比如在 task.py 中新增一段代码:

之后查看文件描述符时会发现父子进程都会有这个文件:

但相反的,子进程中打开的文件父进程是不会有的,这个应该很容易理解。

一些基础知识在排查一些诡异问题时显得尤为重要,比如本次涉及到的父子进程的管道通信,最后来总结一下:

os.popen() 函数是异步执行的,如果需要拿到子进程的输出,需要自行调用 read() 函数。

父子进程是通过匿名管道进行通信的,当读取端关闭时,写入端输出到达管道最大缓存时会收到 SIGPIPE 信号,从而抛出 Broken pipe  异常。

子进程会继承父进程的文件描述符。

到此,相信大家对“为什么Python自带的Print函数会报错”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

那么,函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示:

#funA 作为装饰器函数
 
实际上,上面程序完全等价于下面的程序:
 
通过比对以上 2 段程序不难发现,使用函数装饰器 A() 去装饰另一个函数 B(),其底层执行了如下 2 步操作:
  1. 将 B 作为参数传给 A() 函数;
  2. 将 A() 函数执行完成的返回值反馈回  B。
 
#funA 作为装饰器函数
 


在此基础上,如果在程序末尾添加如下语句:
 


显然,被“@函数”修饰的函数不再是原来的函数,而是被替换成一个新的东西(取决于装饰器的返回值),即如果装饰器函数的返回值为普通变量,那么被修饰的函数名就变成了变量名;同样,如果装饰器返回的是一个函数的名称,那么被修饰的函数名依然表示一个函数。

实际上,所谓函数装饰器,就是通过装饰器函数,在不修改原函数的前提下,来对函数的功能进行合理的扩充。

 
 
在分析 funA() 函数装饰器和 funB() 函数的关系时,细心的读者可能会发现一个问题,即当 funB() 函数无参数时,可以直接将 funB 作为 funA() 的参数传入。但是,如果被修饰的函数本身带有参数,那应该如何传值呢?
比较简单的解决方法就是在函数装饰器中嵌套一个函数,该函数带有的参数个数和被装饰器修饰的函数相同。例如:
 


这里有必要给读者分析一下这个程序,其实,它和如下程序是等价的:
 
 
如果运行此程序会发现,它的输出结果和上面程序相同。
显然,通过 funB() 函数被装饰器 funA() 修饰,funB 就被赋值为 say。这意味着,虽然我们在程序显式调用的是 funB() 函数,但其实执行的是装饰器嵌套的 say() 函数。
但还有一个问题需要解决,即如果当前程序中,有多个(≥ 2)函数被同一个装饰器函数修饰,这些函数带有的参数个数并不相等,怎么办呢?
最简单的解决方式是用 *args 和 **kwargs 作为装饰器内部嵌套函数的参数,*args 和 **kwargs 表示接受任意数量和类型的参数。举个例子:
 

 
上面示例中,都是使用一个装饰器的情况,但实际上,Python 也支持多个装饰器,比如:
 
上面程序的执行顺序是里到外,所以它等效于下面这行代码:

这里不再给出具体实例,有兴趣的读者可自行编写程序进行测试。


我要回帖

更多关于 python定义函数的规则 的文章

 

随机推荐