python学习笔记:三、函数

这是第三篇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++实现python字符串的endswith方法

可以使用的或方法配合比较运算符来模拟方法的功能。下面是一个示例函数,它检查一个字符串是否以另一个字符串结束:在这个示例中,函数接受两个参数:和。函数首先检查的长度是否大于或等于的长度。如果不是,那么显然不能以结束,函数返回。否则,函数使用方法从的末尾提取与长度相同的子字符串,并将其与进行比较。如果它们相等,那么以结束,函数返回。否则,函数返回。请注意,这个函数是区分大小写的。如果你想要一个不区分大小写的版本,你可以在比较之前使用和函数将和转换为小写。在这个版本中,函数首先使用和函数将和转换为小写。然后,它调用函数来检查转换后的字符串是否以结束。

rapidjson如何清空document

在RapidJSON中,要清空一个对象,你可以通过调用成员函数来移除所有的成员。这将会释放中存储的所有数据,并将重置为一个空的状态。下面是一个简单的例子,展示了如何清空一个RapidJSON的对象:在这个例子中,我们首先创建了一个对象并添加了两个成员。然后,我们调用函数来移除所有成员。最后,我们通过调用函数来检查是否已经被清空。请注意,函数只会移除中的成员,它不会释放对象本身所占用的内存。如果你想要完全释放对象的内存,你可能需要让对象离开其作用域,或者手动删除它(如果你是在堆上分配的)。然而,在大多数情况下,你不需要担心这一点,因为对象通常是在栈上分配的,并且会在离开作用域时自动被销毁。

C++ any容器的介绍与简易实现

一、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保存原始指针对造成内存泄漏。完

python学习笔记:二、 流程控制

根据如何学习一门新的语言这篇文章的指导,现在的步骤就是学习这门语言的流程控制了。

通常来讲,流程控制有顺序,选择,循环这几种。python也不例外,也有这三种流程控制。下面的一一学习。

顺序

顺序语句很简单,从上往下依次顺序执行。如:

a = 1
b = 2
print(a+b)

上面的语句就是顺序执行的语句。

选择

选择通常使用if和switch,但python中只有if这一个选择语句。语法是:

if 满足条件1:
    语句1
elif 不满足条件1满足1条件2
    语句2
else 都不满足
    语句3

比如用一个实际的例子

a = 1
b = 2
if a > b:
    print('a>b')
elif a < b:
    print('a<b')
else:
    print('a==b')
# 输出的结果是
a<b

if后面的条件可以使用 and 或者 or 组合。

a = -1
b = -2
if a<0 and a>b:
    print('b<0')
# 输出结果
b<0

循环

python中的循环有for ... in 和while循环。

for ... in 循环语法

for 变量 in 可迭代序列

其中可迭代序列有:字符串,列表,元组,集合。比如用python遍历一个列表

li = ["a","b","c"]
for i in li:
    print(i)
# 输出结果
a
b
c

使用range生成列表,然后用for...in遍历。这个在python中非常常见

for i in range(0,10):
    print(i)

while循环语法

while 满足条件:
    一直执行

比如

a = 0
while a<10:
    a += 1
    print(a)

你可能还喜欢下面这些文章

数据结构学习笔记:树

树树是一种层次关系,在日常生活非常常见,比如社会关系,亲缘关系,文件管理。一棵树是一些节点的集合,这个集合可以是空集,若非空,则一棵树由称作为根的节点r以及0个或者多个非空的(子)树组成,这些子树中的每一棵都是被来自根r的一条有向的边所连接。一种数据结构需要包含一些操作,树这种数据结构有增加,删除,查找,修改。节点节点的度:节点子树的个数。叶子节点:没有儿子的节点,也就是度为0的节点。节点的层次:规定跟节点在1层,其他节点的层次为父节点的层次加1。节点的高:节点的高为从这个节点到叶子的最长路径,所有树叶的高都是0。节点的深度:从跟节点到该节点的唯一路径长,根的深度为0。节点定义typedef

C++入门:二、流程控制

这是我的C++学习笔记第二篇,学习流程控制语句我的学习路径如下:1. 变量和数据类型2. 流程控制3. 函数声明和调用4. 面向对象5. 标准库顺序顺序语句为一条一条顺序执行的语句。C++的顺序语句有赋值,四则运算,位运算,逻辑运算等条件C++提供两种条件,一个是if条件语句,另一个是switch选择语句。if条件switch条件循环循环语句有while循环,for循环,do...while循环。while 循环条件为真,就一直执行语句。如果初次条件不为真,语句一次都不会执行。for 循环更简单的for循环,范围for循环。类似与遍历的效果,序列可以是一个数组,vector,string等迭代

记录一下使用中PDO出现的一个问题:Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll().

在使用PDO的时候,一条sql语句打死都不执行,dump一下errorInfo试试,出现这样的错误信息问题描述居然告诉我还有语句没有执行完成?当前的查询未能执行,逗我么!考虑使用fetchAll,或者开启缓冲查询,行,你说得对....问题出现的使用场景服务器服务器为linux,安装了一个什么面板套件之类的,不是自家机器,也懒得去折腾,在本地的windows环境并没有该问题。程序笔者在对数据库的一个计数字段进行更新的时候,首先会先查询这个记录是否存在,如果存在则进行更新,如果不存在则先插入。问题就出现在记录不存在的时候,当我查询这条不存在的记录时候,发现这个记录不存在,然后进行插入,发现之前的查

Go入门:二、流程控制

这是我的go语言学习笔记的第二篇,go语言的流程控制。流程控制是计算机语言的基本组成部分。一般的流程控制有顺序,分支,循环。这次来学习一下go语言的流程控制都有哪些,语法是什么样的。我将会通过以下步骤来入门go语言1. 变量和数据类型2. 流程控制方法3. 函数声明和调用4. 面向对象5. 语言特性6. 标准库条件分支go语言的条件分支有: if语句,if...else...语句,switch...case...语句。和大多数语言差别不大!if 语句语法// 纯ifif 条件语句 { 表达式}// 带有else 的 ifif 条件语句1 { 表达式1} else 条件语句2 {

Linux信号列表

我们运行如下命令,可看到Linux支持的信号列表:列表中,编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。下面我们对编号小于SIGRTMIN的信号进行讨论。1) SIGHUP本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。登录linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组

python教程(一):变量和数据类型

python的基本数据类型有整型,浮点型,字符串,布尔,列表,元组,字典,集合。它们占用内存和定义方式如下表:

类型占用内存如何定义
整型(int)动态长度>=24字节a = 1
浮点型(float)动态长度>=24字节a = 1.0
字符串(string)动态长度,>=37字节,增加一个字符加1字节a = 'str'
布尔(boolean)24字节a = True
列表(list)动态长度,>=72字节a = []
元组(tupe)动态长度,>=56字节a = ()
集合(set)动态长度,>=232字节a = set([])

占用的内存通过sys.getsizeof()获取。

python中的变量分为可变和不可变类型,其中数字,字符串,元组是不可变类型。因此可以安全地对数字或者字符串进行运算,不会改变原值。字典和列表是可变类型,因此对字段和列表进行某些运算的时候是可以改变原值的,运算时候需要小心。

作用域

知道变量几种类型之后,接下来就需要了解这门语言变量的作用域了。python中的作用域类型比较多,和一般只有局部和全局作用域不太一样,python有四种作用域。

  • L (Local) 局部作用域
  • E (Enclosing) 闭包函数外的函数中
  • G (Global) 全局作用域
  • B (Built-in) 内建作用域

以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。

是在函数,模块,类中定义的变量是局部作用域,意思就是定义的变量只有在函数,模块,类中才能使用,外部是不可使用的。

def a():
    i = 1
    print(1)
a()
print(i)
# 输出
1
Traceback (most recent call last):                                                                     
   File "variable.py", line 11, in                                                              
     print(i)                                                                                           
 NameError: name 'i' is not defined   

可以看到i在外部是没有被定义的,只存在于函数a的内部。

关于变量比较好的文章有

变量的生命周期

变量的生命周期指的是变量从创建到被回收的这段周期。变量在定义的时候被创建,局部变量的生命周期在函数/方法执行完成之后被系统回收。

变量的操作

了解变量的定义,作用域,生命周期之后还需要知道怎样操作变量。这才是我们要迈出去的第一步。不同类型的变量操作不一样,下面分成数字类型,字符串,布尔,元组,列表,集合这几种类型分别说一下其操作。

数字类型

数字类型的变量有四则运算,取模,幂运算,整除。四则运算和取模没啥好说的了。一般语言都支持。下面说一下幂运算和整除。

操作操作符例子
幂运算**a = 2**4
print(a)
#输出
16
整除//a = 4//3
print(a)
# 向下取整
1

字符串类型

python字符串类型的操作就比较多了,非常灵活。简单的可以分为连接,替换,截取,分割,查找这几种。由于python是面向对象的语言,在python中一切皆为对象,因此字符串也是一个对象,拥有一些内建的方法。字符串操作中会使用到一些内建方法而不仅仅是操作符。

操作操作方法例子
连接+a = 'hello'
b = 'world'
print(a+b)
# 输出
helloworld
替换replace(from, to)a = 'hello'
b = a.replace('h', 'a')
print(b)
#输出
alleo
截取字符串[开始索引:结束索引:步长]a = 'hello'
print(a[0]) # 取第一位字符
print(a[0:2]) # 取第1位到第二位字符
print(a[-1]) # 取倒数第一位字符
print(a[::-1]) #翻转

由于字符串切片比较灵活,特别说一下

字符串切片的规则是,字符串[开始索引:结束索引:步长],开始索引,结束索引,步长都是可正可负的。开始索引负数表示从末尾往前数,结束索引同理。

步长为正值,开始索引默认为0, 结束索引默认为最后是len()+1,从开始索引从左往右走;步长为负值, 开始索引默认为-1, 结束索引默认为开始,不能认为是0,也不能认为是-1,从开始索引从右往左走。

这几个正负组合,可以弄出很多花样,比如将一个字符串翻转就可以使用[::-1]

列表

python的控制语句

一门语言的控制语句基本包括顺序语句,条件语句,循环语句,python也不例外。

条件判断

顺序语句就是一条一条执行的语句,没什么好说的,看看python的条件语句,python的条件语句是

if [条件]:
    [执行语句1]
else:
    [执行语句2]

多个条件的语句是

if [条件1]:
    [执行语句1]
elif [条件2]:
    [执行语句2]
else:
    [执行语句3]

循环

python中只有有for循环和while循环。

for循环语法

for [临时变量] in [范围列表]:
    [执行语句]

python的for循环是一个遍历的过程,如下

for i in range(0,10):
   print i

while循环语法

while [条件]:
    [执行语句]

while 语句是一个达到条件就永远执行下去的语句。

比如

i =10
while i > 0:
    print i
    i -= 1 # python 没有i--和i++语句
pass #有时候为了美观,写上一句pass

配合循环用到的语句还有break和continue,break语句跳出最深层次的循环,continue跳出一次循环。python还有一个pass语句,这个语句什么也不干,为了对齐美观可以写上。

字符串处理

需要了解的是对字符串处理,对数字处理,类型转换的函数。

字符串切片

a = "hello"
a[1] #第1个位置的字母e(位置从0开始)
a[1:3] # el,相当于左闭右开的区间[1,3)
a[1:] #从第一个到最后的字符串 ello
a[:2] #从第0个位置开始到第二个位置之前的字符串,
a[-1] #最后一个位置的字符
a[:-1] #从最开始到倒数第二个位置的字符,相当于[0,-1)

日期和时间处理

日期和时间处理需要使用到datetime模块,因此需要 import datetime。datetime模块支持一些日期运算,获取当前日期,格式化日期等方法。比如需要获取今天的日期

>>> import datetime
>>> datetime.date.today().strftime("%Y-%m-%d")
'2018-02-24'

想要更详细的了解datetime模块就要去查看文档了,这不是一个小小的篇幅就能做到的。

你可能还喜欢下面这些文章

Execl宏教程:从hello world开始入门

Excel宏使用的是vba,基本上就是运行在Excel里面的vb。所以学习vba和学习一门编程语言没有什么区别。所以我们最开始需要学的的就是一些基础语句。为了不让学习显得太枯燥,我们从一个hello world开始。首先需要打开Microsoft Excel,找到开发工具->宏,输入一个宏名称,点击创建创建了新的宏之后,就会出现一个编辑器界面Sub test()End Sub使用一个弹窗弹出hello worldSub test()MsgBox("hello world")End Sub到这里,一个简单的宏就创建完成了,虽然它现在什么也不能做,但是别着急,后面宏会为你做很多很多的事情,能

bash教程:一、变量,函数,控制流程

变量的定义和使用变量的定义bash变量定义很简单。如下:a="hello"左边是变量名,右边是变量值。bash是弱类型,因此不需要给a加上类型。注意,等号两边不能有空格 比如 a = "hello",这是错误的。变量使用变量使用需要在定义的变量名之前加上$,比如我们打印之前定义的aecho $a特殊变量后面再说,现在仅仅是最基础的,能够让自己写出一个完整的脚本就行。流程控制流程控制则是编写程序必备的过程,比如顺序,循环,条件,分支等等。在其他类C语言中有if...else,for,while,do...while,switch,那么在bash里面,这些应该怎么写呢。if...else结构a=0