函数调用

python_day4

不羁的心 提交于 2020-02-26 11:03:03
目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一、函数补充进阶    1、函数对象: 函数是第一类对象,即函数可以当作数据传递,它的应用形式也被称为高阶函数,函数的特性如下: a. 可以被引用 1 # def foo(): 2 # print('from foo') 3 # 4 # func = foo 5 # print(foo) # 不加括号为foo函数的内存地址 6 # print(func) # func指向foo内存地址 7 # func() # foo内存地址,加()执行 8 ''' 9 结果: 10 <function foo at 0x0000007D79483E18> 11 <function foo at 0x0000007D79483E18> 12 from foo 13 ''' View Code b. 可以当作参数传递 1 # def foo(): 2 # print('from foo') 3 # 4 # def bar(func): 5 # print(func) 6 # func() 7 # 8 # bar(foo) # foo函数内存地址被当作参数传递到bar函数中,并调用 9 10 ''' 11 结果: 12 <function foo at

Uncaught RangeError: Maximum call stack size exceeded.

帅比萌擦擦* 提交于 2020-02-26 11:00:18
堆栈溢出的产生是由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址,一般容易在递归中产生。所以这种错误一般是在递归函数当中出现,结合报错提示中提到的 returnNodeParameter方法,查看 returnNodeParameter方法自身以及 returnNodeParameter内其他调用方法中是否存在递归函数调用。自己写的代码,那些是递归函数那些不是,心里都有数,既然明确了是递归函数的锅,那就从调用的递归函数中找原因就是。 产生错误原因:问题原因很简单,在 if (temp[i].pid !== ‘0’) 中将本该写成 this.selectedNodePid 的误写成了 this.selectedNode,导致 this.selectedNodePid 在后续递归执行中一直得不到更新,永远是最开始调用的值,从而递归循环一直转不出来,导致无限循环,造成堆栈溢出。 归根结底是参数和参数条件判断的错误导致递归函数一直循环递归调用,无法停止,从而只有在超出浏览器最大堆栈量(内存溢出)时,浏览器抛出错误才能停止。 可以理解为,项目里有死循环! 来源: CSDN 作者: css3html5csdn 链接: https://blog.csdn.net/qq_38402659/article/details/104511088

TCP套接字函数

无人久伴 提交于 2020-02-26 10:59:34
1. socket函数 # include <sys/socket.h> int socket ( int family , int type , int protocol ) ; //若成功则返回非负描述符 //若出错返回-1 2.connect函数 # include <sys/socket.h> int connect ( int sockfd , const struct sockaddr * servaddr , socklen_t addrlen ) ; //若成功则返回0,出错返回-1 第二个参数是一个指向套接字地址结构的指针。 客户再调用函数connect前不必非得调用bind函数。 调用connect函数将激发TCP的三路握手,而且仅在 连接建立成功或出错时 才返回。 出错情况: (1)TCP客户端没有收到SYN分节的响应,返回ETIMEDOUT (2)若对SYN的响应为RST,表明服务器在指定端口没有进程在等待连接。 (3)SYN在中间某个路由器引发“目的地不可达”的ICMP错误。 若connect失败则该套接字不再可用,必须关闭。 3.bind函数 # include <sys/socket.h> int bind ( int sockfd , const struct sockaddr * myaddr , aocklen_t addrlen ) ; /

从lua调用C函数

有些话、适合烂在心里 提交于 2020-02-26 07:13:57
最近在进入Lua编程的状态,一度令我困惑的是,Lua提供的功能少的可怜,跟自备电池的python相比,可说是简陋了。连table的打印,都需要自己实现,也因此有了一打的第三方方案。后来我想明白了,以Lua和C如此紧密的关系,只需要建立Lua的binding,那么丰富而性能强大的C库资源完全可以为Lua所用,这样就不愁功能缺失了。 关于C调用Lua,前段时间已经写过一篇短文了: 《多语言协作与二进制交互》 ,现在补上从Lua调用C的这一篇。先上一段Lua代码: #!/usr/bin/lua require("power") print(square(1.414213598)) print(cube(5)) 在这段代码里,我引用了一个power模块,并且调用了power模块里的square函数和cube函数。由此可知,在C语言编写的power模块里面,需要有相关的函数可以注册本模块提供的函数,并且让Lua可以“感知”到自身是一个模块。回忆一下Lua的路径搜索,可以看到除了后缀名为*.lua的文件之外,还有*.so文件,所以C扩展是编译为.so的。实际情况是,在执行require语句的时候,系统会调用luaopen_power函数,这个函数名是通过luaopen_与power这个模块名拼接得到的。 现在看看luaopen_power函数的定义: int luaopen_power(lua

Golang构建HTTP服务(一)--- net/http库源码笔记

混江龙づ霸主 提交于 2020-02-26 04:53:20
搭建一个简单的Go Web服务器 Go语言标准库 - net/http 在学习Go语言有一个很好的起点, Go语言官方文档 很详细,今天我们学习的Go Web服务器的搭建就需要用到Go语言官方提供的 标准库 net/http,通过http包提供了HTTP客户端和服务端的实现。同时使用这个包能很简单地对web的路由,静态文件,模版,cookie等数据进行设置和操作。如果对http概念不是太清楚的朋友可以自行google。 http包建立Web服务器 package main import ( "fmt" "net/http" "strings" "log" ) func sayhelloName(w http.ResponseWriter, r *http.Request) { r.ParseForm() //解析参数,默认是不会解析的 fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息 fmt.Println("path", r.URL.Path) fmt.Println("scheme", r.URL.Scheme) fmt.Println(r.Form["url_long"]) for k, v := range r.Form { fmt.Println("key:", k) fmt.Println("val:", strings.Join(v, "

pthread_join函数及linux线程

自闭症网瘾萝莉.ら 提交于 2020-02-26 02:48:20
pthread_join使一个线程等待另一个线程结束。 代码中如果没有pthread_join主线程会很快结束从而使整个进程结束,从而使创建的线程没有机会开始执行就结束了。加入pthread_join后,主线程会一直等待直到等待的线程结束自己才结束,使创建的线程有机会执行。 所有线程都有一个线程号,也就是Thread ID。其类型为pthread_t。通过调用pthread_self()函数可以获得自身的线程号。 下面说一下如何创建一个线程。 通过创建线程,线程将会执行一个线程函数,该线程格式必须按照下面来声明: void * Thread_Function(void *) 创建线程的函数如下: int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg); 下面说明一下各个参数的含义: thread:所创建的线程号。 attr:所创建的线程属性,这个将在后面详细说明。 start_routine:即将运行的线程函数。 art:传递给线程函数的参数。 下面是一个简单的创建线程例子: #include <pthread.h> #include <stdio.h> /*

Chaincode的开发环境和Hello world

倾然丶 夕夏残阳落幕 提交于 2020-02-26 01:55:47
Chaincode的开发环境和Hello world 使用GO lang对Chaincode进行开发 # 安装Golang的SDK go get github.com/hyperledger/fabric-sdk-go # 安装shim包 go get -u github.com/hyperledger/fabric/core/chaincode/shim ​ 启动链码必须通过调用shim包中的Start函数实现,而Start函数被调用时需要传递一个类型为Chaincode的参数,这个Chaincode参数是一个接口类型,该接口中有两个重要的函数——Init和Invoke。 type Chaincode interface{ Init(stub ChaincodeStubInterface) peer.Response Invoke(stub ChaincodeStubInterface) peer.Response } Init: 在链码实例化或升级时被调用,完成初始化数据的工作。 Invoke: 在更新或查询提案事务中的分类账本数据状态时被调用,因此响应调用或查询的业务实现逻辑都需要在此函数中编写实现。 在实际开发中,开发人员可以自行定义一个结构体,然后重写Chaincode接口的两个函数,并将两个函数指定为自定义结构体的成员方法 必要结构 package main //

Shell编程之case语句与函数

寵の児 提交于 2020-02-26 01:21:59
一、case语句 1.语法结构 2.应用案例 1)脚本传不同值做不同事 2)根据用户需求选择做事 二、函数 1.什么是函数? 2.如何定义函数? 3.函数如何调用? 1)当前命令行调用 2)定义到用户的环境变量中 3)脚本中调用 三、综合案例 1.任务背景 2.具体要求 3.综合分析 4.落地实现 四、正则表达式 1.正则表达式是什么? 2.正则能干什么? 3.正则当中名词解释 4.第一类正则表达式 1)正则中普通常用的元字符 2)正则中其他常用元字符 3)扩展类正则常用元字符 5.第二类正则 6.正则表达式总结 五、正则元字符一栏表 六、正则练习作业 1.文件准备 2.具体要求 七、课后作业 脚本搭建web服务 一、case语句 case语句为多重匹配语句 如果匹配成功,执行相匹配的命令 1. 语法结构 说明:pattern表示需要匹配的模式 case var in 定义变量;var代表是变量名 pattern 1) 模式1;用 | 分割多个模式,相当于or command1 需要执行的语句 ;; 两个分号代表命令结束 pattern 2) command2 ;; pattern 3) command3 ;; *) default,不满足以上模式,默认执行*)下面的语句 command4 ;; esac esac表示case语句结束 2. 应用案例 1)脚本传不同值做不同事

C++编译过的C代码为什么要用extern C

。_饼干妹妹 提交于 2020-02-25 23:35:35
首先extern关键字: extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。相反,static关键字则是只能在本模块中使用。 通常,在模块的 头文件 中对本模块 提供给其它模块引用的函数和全局变量 以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数 extern "C": extern "C"是连接申明(linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的, extern "C"必须出现在函数的第一次声明上。 作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为: void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int

进程关系

寵の児 提交于 2020-02-25 22:22:53
文章目录 进程组 会话 控制终端 函数`tcgetpgrp`、`tcsetpgrp`和`tcgetsid` 作业控制 shell执行程序 孤儿进程组 进程组 每个进程除了有一进程ID外,还属于一个进程组。函数 getpgrp 用于返回调用进程的进程组ID。 # include <unistd.h> pid_t getpgrp ( void ) ; 返回值:调用进程的进程组ID。 getpgid 函数用于获取指定 pid 的进程的组ID。 # include <unistd.h> pid_t getpgid ( pid_t pid ) ; 返回值:若成功,返回进程组ID;若出错,返回 - 1 。 若 pid 是0,返回调用进程的进程组ID,于是 getpgid(0); 等价于 getpgrp(); 每个进程组有一个组长进程。组长进程的进程组ID等于其进程ID。进程组组长可以创建一个进程组、创建该组中的进程,然后终止。只要在某个进程组中有一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。从进程组创建开始到其中最后一个进程离开为止的时间段为进程组的生命期。某个进程组中的最后一个进程可以终止,也可以转移到另一个进程组。 setpgid 函数用于将调用其的进程加入一个现有进程组或是创建一个新进程组。 # include <unistd.h> int setpgid ( pid_t