我的Python升级打怪之路【三】:Python函数

函数

在函数之前,我们一直遵循者:面向过程编程,即:根据业务逻辑从上到下实现功能,开发过程中最常见的就是粘贴复制。代码就没有重复利用率。

例如:有好多的重复的代码

1 if 条件:
2     发送指令
3     接收结果
4 elif 条件:
5     发送指令
6     接收结果
7 elif 条件:
8     发送指令
9     接收结果

如果我们将重复的代码提取出来

例如:代码简洁多了

 1 def 一条操作(参数):
 2     发送指令
 3     接收结果
 4 
 5 if 条件:
 6     一条操作
 7 elif 条件:
 8     一条操作
 9 elif 条件:
10     一条操作

对于以上两种方式,第二种明显要优于第一种,重用性可读性大大增加。这就是函数式编程和面向过程编程的区别

  • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅仅调用函数即可。
  • 面向对象:对函数进行分类和封装。
  • 函数式编程最重要的是增强代码的重用性和可读性

1.函数的定义和使用

1.定义:

1 def 函数名(参数):
2 
3     函数体
4     
5     返回值(默认不写,返回值为空)

函数的定义要点:

  • def:定义函数的关键字
  • 函数名:之后会根据函数名对函数进行调用
  • 函数体:函数中进行一系列的逻辑计算
  • 参数:为函数提供数据
  • 返回值:当函数执行完毕后,用于给调用者返回数据,默认为空

2.参数:

为什么要有参数呢?

1 def 操作(参数):
2     发送一条指令('ls')
3 
4 if 条件:
5     操作()
6 elif 条件:
7     操作()
8 
9 # 不管是if还是elif,发送的都是同一条指令ls
无参数例子
1 def 函数(参数):
2     执行指令(参数)
3 
4 if 条件:
5     函数(ls)
6 elif 条件:
7     函数(pwd)
有参数的例子

函数中有三种不同的参数:

  • 普通参数
  • 默认参数
  • 动态参数
1 #************定义****************
2 #name 叫做函数func的形式参数,简称:形参
3 def func(name):
4     print(name)
5 
6 #************调用****************
7 # 'nullnull'叫做func的实际参数,简称:实参
8 func('nullnull')
普通参数
1 def func(name,age=20)
2     print(name,age)
3 
4 # 指定参数
5 func('nullnull',18)
6 func(name="nullnull",age=20)
7 
8 #使用默认参数
9 func("null")
默认参数
1 def func(*args):
2     print(args)
3 
4 #执行方式一
5 func(1,2,3,4,5,6,7)
6 
7 #执行方式二
8 li = [1,2,3,4,5,6,7]
9 func(*li)
动态参数args
1 def func(**kwargs):
2     print(kwargs)
3 
4 # 执行方式一
5 func(name="nullnull",age=18)
6 
7 # 执行方式二
8 dic = {'name':'nullnull','age':18}
9 func(**dic)
动态参数kwargs

特别的,普通参数,默认参数,动态参数是有顺序要求的

1 def func(普通参数,默认参数,*args,**kwargs):
2     pass
参数的顺序要求

Python的内置函数

函数详解

 Lambda表达式

 对于简单的函数,有一种简便的表示方式,即:lambda表达式

 1 #*************普通函数**************
 2 #定义函数
 3 def func(arg):
 4     print(arg)
 5 
 6 #执行函数
 7 func('null')
 8 
 9 
10 #*************lambda***************
11 #定义函数(lambda表达式)
12 my_lambda = lambda arg : arg + 1
13 
14 #执行函数
15 my_lambda(0)

递归

利用Python编写斐波那契数列:

  斐波那契数列:0,1,1,2,3,5,8,13......

1 def func(arg1,arg2):
2     if arg1 == 0:
3         print(arg1,arg2)
4     arg3 = arg1 + arg2
5     print(arg3)
6     func(arg2,arg3)
7 
8 func(0,1)

补充:三元运算符 

 三元运算(三目运算),是对简单的条件语句的缩写

1 result = 值1 if 条件 else 值2
2 
3 #如果条件成立,那么result = 值1,否则result = 值2

补充:深浅拷贝

 对于数字 字符串而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址

 1 import copy
 2 
 3 n1 = 1
 4 
 5 #查看n的内存地址
 6 print(id(n1))
 7 
 8 #将n1赋值给n2
 9 n2 = n1
10 print(id(n2))
11 
12 #浅拷贝
13 n3 = copy.copy(n1)
14 print(id(n3))
15 
16 #深拷贝
17 n4 = copy.deepcopy(n1)
18 print(id(n4))

你会神奇的发现打印的都是相同的

对于字典、元组、列表 而言,进行赋值、浅拷贝、深拷贝时,其内存地址的变化时不一样的

 1.赋值

1 n1 = {"k1":'nullnull',"k2":1,"k3":['hello','python']}
2 
3 n2 = n1

 

2.浅拷贝

浅拷贝,在内存中额外创建 第一层 的数据

1 import copy
2 
3 n1 = {"k1":"nullnull","k2":1,"k3":["hello","python"]}
4 
5 n2 = copy.copy(n1)

3.深拷贝

深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:Python内部对字符串和数字的优化)

1 import copy
2 
3 n1 = {"k1":"nullnull","k2":1,"k3":["hello","python"]}
4 
5 n2 = copy.deepcopy(n1)

原文地址:https://www.cnblogs.com/smiling-crying/p/9203696.html