这是第三篇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这点非常棒!
你可能还喜欢下面这些文章
可以使用的或方法配合比较运算符来模拟方法的功能。下面是一个示例函数,它检查一个字符串是否以另一个字符串结束:在这个示例中,函数接受两个参数:和。函数首先检查的长度是否大于或等于的长度。如果不是,那么显然不能以结束,函数返回。否则,函数使用方法从的末尾提取与长度相同的子字符串,并将其与进行比较。如果它们相等,那么以结束,函数返回。否则,函数返回。请注意,这个函数是区分大小写的。如果你想要一个不区分大小写的版本,你可以在比较之前使用和函数将和转换为小写。在这个版本中,函数首先使用和函数将和转换为小写。然后,它调用函数来检查转换后的字符串是否以结束。
在RapidJSON中,要清空一个对象,你可以通过调用成员函数来移除所有的成员。这将会释放中存储的所有数据,并将重置为一个空的状态。下面是一个简单的例子,展示了如何清空一个RapidJSON的对象:在这个例子中,我们首先创建了一个对象并添加了两个成员。然后,我们调用函数来移除所有成员。最后,我们通过调用函数来检查是否已经被清空。请注意,函数只会移除中的成员,它不会释放对象本身所占用的内存。如果你想要完全释放对象的内存,你可能需要让对象离开其作用域,或者手动删除它(如果你是在堆上分配的)。然而,在大多数情况下,你不需要担心这一点,因为对象通常是在栈上分配的,并且会在离开作用域时自动被销毁。
一、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保存原始指针对造成内存泄漏。完