函数调用

python中名称修饰与描述符

孤者浪人 提交于 2020-03-25 21:05:23
名称修饰 java和C#等其他高级语言中都有private关键字来修饰一个属性或字段是私有的,但是python中并没有private,而是有个与它接近的概念旧式名称修饰。每当在一个属性前面加上__前缀,解释器就会立刻将其重命名: 直接访问会抛异常 利用dir函数查看内部属性 python内部会把__前缀的属性重命名为【_类名+属性名】;因此在python中如果一个属性不是共有的就约定使用双下划线__为前缀,它不会调用任何名称修饰的算法,只是说名这个属性是该类的私有属性。 幸运的是python中还有其他机制类构建类的私有和共有代码,即使用描述符和property这些POP设计的关键特性 什么是描述符 python描述符是一个“绑定行为”的对象属性,在描述符协议中,它可以通过方法重写属性的访问。这些方法有 __ get__(), __ set__(), 和__delete__()。如果这些方法中的任何一个被定义在一个对象中,这个对象就是一个描述符 它是一个类,定义了另一个类的访问方式,即一个类可以将属性管理托管给另一个类 描述符协议 描述符类基于3个特殊方法,这3个方法组成了描述符协议 __ set__(self,obj,type=none)设置属性时调用,也称为setter __ get__(self,obj,value) 读取属性时调用,也称为getter __ delete__

python递归函数

心不动则不痛 提交于 2020-03-25 17:26:17
递归函数的介绍 函数的递归调用:本质是函数嵌套调用的一种特殊形式,简单的讲就是在 调用一个函数的过程中又直接或间接地调用该函数本身 直接调用函数本身 示例: def f1(): print('是我是我还是我') f1() f1() 间接调用函数本身 示例: def f1(): print('from f1') f2() def f2(): print('from f2') f1() f1() 从上面两个图可以看出,两种情况下的递归调用都是一个无限循环的过程,但在python对函数的递归调用的深度做了限制,因而并不会像大家所想的那样进入无限循环,会抛出异常,要避免出现这种情况,就 必须让递归调用在满足某个特定条件下终止 。 提示: #1. 可以使用sys.getrecursionlimit()去查看递归深度,默认值为1000,虽然可以使用 sys.setrecursionlimit()去设定该值,但仍受限于主机操作系统栈大小的限制 #2. python不是一门函数式编程语言,无法对递归进行尾递归优化。 代码循环运行的两种方式(死循环) # 方式一:while、for循环 while True: print(1111) print(2222) print(3333) # 方式二:递归的本质就是循环: def f1(): print(1111) print(2222) print

php socket 编程

做~自己de王妃 提交于 2020-03-25 15:02:30
文章目录 1.实验预习:tcp协议 2.SOCKET 编程 3.多进程编程 4 I/O复用 5. 信号通信以及守护进程 1.实验预习:tcp协议 TCP协议的创建: 创建流程:1.客户端主动调用connect发送SYN分节;2.服务器端必须回复一个ACK分节来确认客户端的SYN分节,并发送一个SYN分节给客户端;3.客户端对服务器端发送SYN分节进行ACK分节的确认 TCP协议的拆除(TCP为全双工的传输协议,所以需要4次分节的交换): 拆除流程:1.首先申请拆除的一端调用close发送一个FIN分节;2.另一端接收到FIN分节时,发送一个ACK分节进行确认;3.另一端要申请拆除连接时,也要发送一个FIN分节;4.接收端发送一个ACK分节进行确认 TCP的状态转换图 连接: 1.SYN_SENT主动打开,SYN分节已发送; 2.SYN_RCVD被动打开,SYN分节已接收; 3.ESTABLISHED已经建立连接 关闭: 1.FIN_WAIT_1发起主动关闭,FIN分节已发送; 2.CLOSE_WAIT被动关闭,FIN分节已接收,ACK分节已发送; 3.FIN_WAIT_2成功实现半关闭,ACK分节已接收; 4.LAST_ACK最终的ACK,FIN分节已发送; 5.TIME_WAIT FIN分节已接收,ACK分节已发送; 6.CLOSE ACK分节已接收,成功拆除连接] 2

ES6 函数的拓展笔记

爱⌒轻易说出口 提交于 2020-03-25 06:00:54
1.函数参数的默认值   (1)ES6允许为函数的参数设置默认值,即直接写在参数定义的后面。   function log( x, y = 'world' ) { xxx }   function Point( x = 0, y = 0) { xxx }   参数默认值不是传值的,而是每次都重新计算默认值表达式的值。也就是说,参数默认值是惰性求值的。   (2)与解构赋值默认值结合使用    function foo( { x, y = 5 }) { console.log(x, y) };    foo({ }) // undefined,5    foo({ x:1 }) // 1, 5    foo({x:1, y:2 }) // 1, 2    foo() // TypeError:Cannot read property 'x' of undefined    表明,只当函数foo的参数是一个对象是,变量x和y才会通过解构赋值生成。如果foo调用时没有提供参数,变量x和y就不会生成,从而报错。通过提供函数参数的默认值,就可以避免这种情况。   将上段代码参数部分更改为:function foo( { x, y=5 } = { } ){ xxx }; foo() // undefined, 5   表明,如果没有提供参数,函数foo的参数默认为一个空对象。   (3

jQuery hover() 方法

妖精的绣舞 提交于 2020-03-25 05:38:21
1 $("p").hover(function(){ 2 $("p").css("background-color","yellow"); 3 },function(){ 4 $("p").css("background-color","pink"); 5 }); 定义和用法 hover() 方法规定当鼠标指针悬停在被选元素上时要运行的两个函数。 方法触发 mouseenter 和 mouseleave 事件。 注意: 如果只指定一个函数,则 mouseenter 和 mouseleave 都执行它。 语法 $( selector ).hover( inFunction,outFunction ) 调用: $( selector ).hover( handlerIn, handlerOut ) 等同以下方式: $( selector ).mouseover( handlerIn ).mouseout( handlerOut ); 注意: 如果只规定了一个函数,则它将会在 mouseover 和 mouseout 事件上运行。 调用: $(selector).hover(handlerInOut) 等同于: $( selector ).on( "mouseover mouseout", handlerInOut ); 来源: https://www.cnblogs.com

js函数 循环

依然范特西╮ 提交于 2020-03-25 04:32:16
值类型之间的相互转化 转字符串:String() | .toString() | "" + // 123..toString() | 重点是 "" + 转数字:Number(a) | parseFloat() | parseInt() | + // +'123' // parseFloat('3.14.15') => 3.14 | parseInt('3.14.15') => 3 转布尔:Boolean(a) ​ 非数字:NaN // 当一个其他类型转化为数字类型的产物 // 任何判断一个结果是否是NaN, isNaN(运算) <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>类型转化</title> </head> <body> 值类型之间的相互转化 </body> <script> // number | string | boolean ​ // 转化为boolean var num = 10; var s = "123"; ​ num = 0; s = ""; var b1 = Boolean(num); var b2 = Boolean(s); console.log(b1, b2); ​ // 后期我们会在if分支结构中的判断以及循环中的判断中使用boolean类型, // 以上两种情况下,

Linux网络IO模型

别来无恙 提交于 2020-03-24 13:53:25
同步和异步,阻塞和非阻塞 同步和异步 关注的是结果消息的通信机制 同步 : 同步的意思就是调用方需要主动等待结果的返回 异步 : 异步的意思就是不需要主动等待结果的返回,而是通过其他手段比如,状态通知,回调函数等。 阻塞和非阻塞 主要关注的是等待结果返回调用方的状态 阻塞 : 是指结果返回之前,当前线程被挂起,不做任何事 非阻塞 : 是指结果在返回之前,线程可以做一些其他事,不会被挂起。 两者的组合 1. 同步阻塞 : 同步阻塞基本也是编程中最常见的模型,打个比方你去商店买衣服,你去了之后发现衣服卖完了,那你就在店里面一直等,期间不做任何事 ( 包括看手机 ) ,等着商家进货,直到有货为止,这个效率很低。 2. 同步非阻塞 : 同步非阻塞在编程中可以抽象为一个轮询模式,你去了商店之后,发现衣服卖完了,这个时候不需要傻傻的等着,你可以去其他地方比如奶茶店,买杯水,但是你还是需要时不时的去商店问老板新衣服到了吗。 3. 异步阻塞 : 异步阻塞这个编程里面用的较少,有点类似你写了个线程池 ,submit 然后马上 future.get () ,这样线程其实还是挂起的。有点像你去商店买衣服,这个时候发现衣服没有了,这个时候你就给老板留给电话,说衣服到了就给我打电话,然后你就守着这个电话,一直等着他响什么事也不做。这样感觉的确有点傻,所以这个模式用得比较少。 4. 异步非阻塞 : 异步非阻塞

用好Lua+Unity,让万金6.0平台搭建性能飞起来——Lua与C#交互篇

谁说我不能喝 提交于 2020-03-24 12:22:13
前言万金6.0平台搭建论坛:haozbbs.com Q1446595067 在看了uwa之前发布的《Unity项目常见Lua解决方案性能比较》,决定动手写一篇关于lua+unity方案的性能优化文。 整合lua是目前最强大的unity热更新方案,毕竟这是唯一可以支持ios热更新的办法。然而作为一个重度ulua用户,我们踩过了很多的坑才将ulua上升到一个可以在项目中大规模使用的状态。事实上即使到现在lua+unity的方案仍不能轻易的说可以肆意使用,要用好,你需要知道很多。 因此,这篇文章是从一堆简单的优化建议里头,逐步挖掘出背后的原因。只有理解了原因,才能很清楚自己做的优化,到底是为了什么,有多大的效果。 从最早的lua纯反射调用c#,以及云风团队尝试的纯c#实现的lua虚拟机,一直发展到现在的各种luajit+c#静态lua导出方案,lua+unity才算达到了性能上实用的级别。 但即使这样,实际使用中我们会发现,比起cocos2dx时代luajit的发扬光大,现在lua+unity的性能依然存在着相当的瓶颈。仅从《性能比较》的test1就可以看到,iphone4s下二十万次position赋值就已经需要3000ms,如果是coc这样类型的游戏,不处理其他逻辑,一帧仅仅上千次位置赋值(比如数百的单位、特效和血条)就需要15ms,这显然有些偏高。 是什么导致lua

IO多路复用之select poll epoll

夙愿已清 提交于 2020-03-24 11:31:37
参考文档: http://blog.csdn.net/tennysonsky/article/details/45745887 select(),poll(),epoll()都是I/O多路复用的机制。I/O多路复用通过一种机制, 可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪,就是这个文件描述符进行读写操作之前),能够通知程序进行相应的读写操作 。 但select(),poll(),epoll()本质上都是同步I/O ,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 与多线程和多进程相比,I/O 多路复用的最大优势是系统开销小,系统不需要建立新的进程或者线程,也不必维护这些线程和进程。 select 监视并等待多个文件描述符的属性变化(可读、可写或错误异常) select()函数监视的文件描述符分 3 类,分别是writefds、readfds、和 exceptfds 调用后 select() 函数会阻塞,直到有描述符就绪(有数据可读、可写、或者有错误异常),或者超时( timeout 指定等待时间),函数才返回 当 select()函数返回后,可以通过遍历 fdset,来找到就绪的描述符 int select(int nfds, fd_set

C调用Python脚本文件里的函数

故事扮演 提交于 2020-03-24 06:44:04
#Python脚本,存为pytest.py def add(a,b): print "in python function add" print "a = " + str(a) print "b = " + str(b) print "ret = " + str(a+b) return a + b // C代码调,用上面的add函数 #include <stdio.h> #include <stdlib.h> #include "C:/Python26/include/python.h" #pragma comment(lib, "C:\\Python26\\libs\\python26.lib") int main(int argc, char** argv) { // 初始化Python //在使用Python系统前,必须使用Py_Initialize对其 //进行初始化。它会载入Python的内建模块并添加系统路 //径到模块搜索路径中。这个函数没有返回值,检查系统 //是否初始化成功需要使用Py_IsInitialized。 PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pRetVal; Py_Initialize(); // 检查初始化是否成功 if ( !Py_IsInitialized() ) { return