这是第三篇python学习笔记,我们即将要学习python的函数。内容主要包括两个部分,函数的声明和函数的调用。
函数声明和调用
比如我们要声明一个“吃”的函数,语法如下:
def eat(): return "eat something" print(eat())
上面是一个没有参数的函数,做的事情很简单,声明一个函数,然后返回一个字符串。接下来要增加一个参数了。
def ead(food): return "eat %s" % food print(eat('fruit'))
可以看到,上面声明了一个带有一个参数的函数,当然可以声明带两个,三个等。这些都是固定的,那么如果要声明一个不固定参数的函数呢?看代码
# 比如下面就是吃一份主食和一些小吃 # 小吃可以是一个,也可以是多个 def eat(food, *snack): result = [] result.append("eat %s\n" % food) for i in snack: result.append("also eat some %s\n" % i) return ''.join(result) print(eat('rice', 'banana', 'apple'))
参数传递的注意事项
函数的使用很简单,不过在传递参数的时候需要注意一些事情,比如传值和传引用。这中区别在大部分语言中都会存在,python也不例外。由于在python中,一切皆为对象,因此我们称呼这个为传不可变对象和传可变对象。
先用一个例子来说名这个问题
def change(a): a = 1 b = 2 change(b) print(b) # 结果是2
上面的就是传递不可变对象,不可变对象传入之后会新建一份拷贝,返回新的对象。不可变对象有:整型、字符串、元组。
再看看传可变对象
def change(a): a.append(4) b = [1,2,3] change(b) print(b) # 结果是 [1,2,3,4]
很显然,b被改变了,这相当于传了一个引用,直接修改了原值。常见的可变对象有列表,字典。
默认参数
声明函数的时候可以预定义一些默认参数,比如查询分页的时候,可以默认每一页20条数据,默认根据时间字段,默认倒序。这样既节省函数的记忆成本又不失灵活性。
def query(page, per_page=20, order_by = 'date', order = 'desc'): return "query page %d, per page %d order by %s order %s" % (page, per_page, order_by, order) print(query(1)) # query page 1, per page 20 order by date order desc
函数调用指定参数名称
这是一个非常好的特性,调用函数的时候可以直指定参数的名称,比如我只想更改查询的循序,python中可以直接这样写
print(query(page=1, order='asc'))
而在其他的语言,可能要把所有的参数都写一遍,python这点非常棒!
你可能还喜欢下面这些文章
这是我学习C++的第三篇笔记,函数。我的学习路径是现在学习的是函数的声明、定义、调用等相关知识。函数声明和定义函数的声明包含返回类型,函数名字,0个或者多个形参,无函数体,通常在头文件中对函数进行声明。函数的定义包含返回类型,函数名字,0个或多个形参,以及函数体。比如写一个求阶乘的函数,可以写成下面这样写一些简单的函数大多数语言都差不多,不过可惜每种语言或多或少都有自己的特色,这是比较令人头秃的地方。函数的参数函数可以带有0或多个参数,每个参数都需要声明类型。参数传递可以传值和传引用。如果形参是引用类型,那么它将绑定到对应的实参中,我们成为传引用。否则,将会把实参的值拷贝后赋值给形参,我们成为
这是我Go学习笔记的第三篇!接下来学习的是Go的函数声明和调用。我的语言学习过程一般分为下面几个:1. 变量和数据类型2. 流程控制方法3. 函数声明和调用4. 面向对象5. 语言特性6. 标准库函数声明func 函数名称(参数表) 返回值类型 { // 函数体}写一个函数是非常简单的,掌握语法格式就可以了。函数是一个功能的封装,能让函数体内的代码得到很好的复用。比如我要输出个人信息,我可以把个人信息封装到函数里面,后续直接调用这个函数而不是每次都print一堆信息了上面定义的函数没有参数,也没有返回值,非常简单的一个函数。如果我想让姓名可变,那么可以定义一个带有参数的函数接下来定义一个有
shell中 $? $# $* $$ $* $@ $0 特殊变量含义
shell中有一些常用的难记的特殊变量,如下:$0当前脚本的文件名$n传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。$#传递给脚本或函数的参数个数。$*传递给脚本或函数的所有参数。$@传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同$?上个命令的退出状态,或函数的返回值。$$当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。$0 - 当前脚本文件名$n - 第n个参数$# - 参数个数$* - 所有参数$@ - 所有参数$? - 上一个命令的返回值$$ - 当前进程id
可以使用的或方法配合比较运算符来模拟方法的功能。下面是一个示例函数,它检查一个字符串是否以另一个字符串结束:在这个示例中,函数接受两个参数:和。函数首先检查的长度是否大于或等于的长度。如果不是,那么显然不能以结束,函数返回。否则,函数使用方法从的末尾提取与长度相同的子字符串,并将其与进行比较。如果它们相等,那么以结束,函数返回。否则,函数返回。请注意,这个函数是区分大小写的。如果你想要一个不区分大小写的版本,你可以在比较之前使用和函数将和转换为小写。在这个版本中,函数首先使用和函数将和转换为小写。然后,它调用函数来检查转换后的字符串是否以结束。
new 和 make 是两个内置函数,主要用来创建并分配类型的内存。在我们定义变量的时候,可能会觉得有点迷惑,不知道应该使用哪个函数来声明变量,其实他们的规则很简单,new 只分配内存,make 只能用于 slice、map 和 channel 的初始化。下面我们就来具体介绍一下new在Go语言中,new 函数描述如下:从上面的代码可以看出,new 函数只接受一个参数,这个参数是一个类型,并且返回一个指向该类型内存地址的指针。同时 new 函数会把分配的内存置为零,也就是类型的零值。【示例】使用 new 函数为变量分配内存空间。当然,new 函数不仅仅能够为系统默认的数据类型,分配空间,自定义
在C++中,你可以使用的成员函数来获取最后一个元素。这个函数返回对向量中最后一个元素的引用。以下是一个简单的示例:在这个例子中,我们创建了一个包含五个整数的。然后,我们使用函数获取最后一个元素,并将其存储在变量中。最后,我们打印出这个元素。请注意,如果向量是空的(即,不包含任何元素),调用函数将导致未定义行为。因此,在调用之前,最好先检查向量是否为空,这可以通过调用成员函数来完成。
这篇文章讨论基于语言的基本要素,如何快速入门一种计算机语言。是一篇语言从学习到使用的指导手册,并且这种学习方式是一个系统的学习,相比于碎片化的学习,这种学习更加不容易遗忘。语言的基本成分语言的基本成分为数据、运算、控制、传输。想想你学过的语言,是不是都是这样。归结语言的组成成分,学习一门语言可以从这四个方面下手,这四个方面掌握之后,对这个语言就有个最基本的了解了。语言基本成分:数据数据是程序操作的对象。实际上我们可以思考,一个数据拥有的属性有哪些,根据我们已经掌握的语言来说(比如PHP)。$a = 1$a是数据,那么这个数据有哪些属性呢?名称(a),类型(int)。从这一行代码只能发现这两个属
很少用到,但是有时候又必须用到,这里收集一下mysql的常用函数一、数学函数ABS(x) 返回x的绝对值BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x) 返回大于x的最小整数值EXP(x) 返回值e(自然对数的底)的x次方FLOOR(x) 返回小于x的最大整数值GREATEST(x1,x2,...,xn)返回集合中最大的值LEAST(x1,x2,...,xn) 返回集合中最小的值LN(x) 返回x的自然对数LOG(x,y)返回x的以y为底的对数MOD(x,y)
一、any容器是什么?1、any“不是”模板类,any是一种很特殊的容器。2、any只能容纳一个元素,但这个元素可以是任意的类型,可以是基本数据类型(int、double、string、标准容器或者任何自定义类型)。3、一种动态(类型检查只发生在运行时)语言特性的数据结构。4、C++17引入,需要RIIT支持,VS默认是没有支持C++17的,需要自己修改设置,如果不能使用any,请修改标准。二、any类摘要C++typeid关键字详解:三、any类用法注意:any的析构函数删除内部holder对象。如果类型是指针,any并不会对指针执行delete操作,所有any保存原始指针对造成内存泄漏。完
signal作用是为信号注册一个处理器。这里的“信号”是软中断信号,这种信号来源主要有三种:程序错误:比如除0,非法内存访问。外部信号:终端Ctrl-C产生的SIGINT信号,定时器产生的SIGALERM。显示请求:kill函数发送的任意信号。当kill一个进程的时候,默认会发送SIGTERM信号,此时这个信号只有默认处理操作(SIG_DFL),直接中断进程执行。如果此时该进程正在执行一个任务,直接终止该进程会导致任务没有完成。这个时候为SIGTERM信号注册一个信号处理函数就十分有必要。介绍参数sig要设置信号处理函数的信号。它可以是实现定义值或下例值之一:SIGABRTSIGFPESIGI