我的Python升级打怪之路【三】:Python函数
函数
在函数之前,我们一直遵循者:面向过程编程,即:根据业务逻辑从上到下实现功能,开发过程中最常见的就是粘贴复制。代码就没有重复利用率。
例如:有好多的重复的代码
if 条件:
发送指令
接收结果
elif 条件:
发送指令
接收结果
elif 条件:
发送指令
接收结果
如果我们将重复的代码提取出来
例如:代码简洁多了
def 一条操作(参数):
发送指令
接收结果 if 条件:
一条操作
elif 条件:
一条操作
elif 条件:
一条操作
对于以上两种方式,第二种明显要优于第一种,重用性可读性大大增加。这就是函数式编程和面向过程编程的区别
- 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅仅调用函数即可。
- 面向对象:对函数进行分类和封装。
- 函数式编程最重要的是增强代码的重用性和可读性
1.函数的定义和使用
1.定义:
def 函数名(参数):
函数体
返回值(默认不写,返回值为空)
函数的定义要点:
- def:定义函数的关键字
- 函数名:之后会根据函数名对函数进行调用
- 函数体:函数中进行一系列的逻辑计算
- 参数:为函数提供数据
- 返回值:当函数执行完毕后,用于给调用者返回数据,默认为空
2.参数:
为什么要有参数呢?
def 操作(参数):
发送一条指令('ls') if 条件:
操作()
elif 条件:
操作() # 不管是if还是elif,发送的都是同一条指令ls
无参数例子
def 函数(参数):
执行指令(参数) if 条件:
函数(ls)
elif 条件:
函数(pwd)
有参数的例子
函数中有三种不同的参数:
- 普通参数
- 默认参数
- 动态参数
#************定义****************
#name 叫做函数func的形式参数,简称:形参
def func(name):
print(name) #************调用****************
# 'nullnull'叫做func的实际参数,简称:实参
func('nullnull')
普通参数
def func(name,age=20)
print(name,age) # 指定参数
func('nullnull',18)
func(name="nullnull",age=20) #使用默认参数
func("null")
默认参数
def func(*args):
print(args) #执行方式一
func(1,2,3,4,5,6,7) #执行方式二
li = [1,2,3,4,5,6,7]
func(*li)
动态参数args
def func(**kwargs):
print(kwargs) # 执行方式一
func(name="nullnull",age=18) # 执行方式二
dic = {'name':'nullnull','age':18}
func(**dic)
动态参数kwargs
特别的,普通参数,默认参数,动态参数是有顺序要求的
def func(普通参数,默认参数,*args,**kwargs):
pass
参数的顺序要求
Python的内置函数

Lambda表达式
对于简单的函数,有一种简便的表示方式,即:lambda表达式
#*************普通函数**************
#定义函数
def func(arg):
print(arg) #执行函数
func('null') #*************lambda***************
#定义函数(lambda表达式)
my_lambda = lambda arg : arg + 1 #执行函数
my_lambda(0)
递归
利用Python编写斐波那契数列:
斐波那契数列:0,1,1,2,3,5,8,13......
def func(arg1,arg2):
if arg1 == 0:
print(arg1,arg2)
arg3 = arg1 + arg2
print(arg3)
func(arg2,arg3) func(0,1)
补充:三元运算符
三元运算(三目运算),是对简单的条件语句的缩写
result = 值1 if 条件 else 值2 #如果条件成立,那么result = 值1,否则result = 值2
补充:深浅拷贝
对于数字 字符串而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址
import copy n1 = 1 #查看n的内存地址
print(id(n1)) #将n1赋值给n2
n2 = n1
print(id(n2)) #浅拷贝
n3 = copy.copy(n1)
print(id(n3)) #深拷贝
n4 = copy.deepcopy(n1)
print(id(n4)) 你会神奇的发现打印的都是相同的
对于字典、元组、列表 而言,进行赋值、浅拷贝、深拷贝时,其内存地址的变化时不一样的
1.赋值
n1 = {"k1":'nullnull',"k2":1,"k3":['hello','python']}
n2 = n1

2.浅拷贝
浅拷贝,在内存中额外创建 第一层 的数据
import copy
n1 = {"k1":"nullnull","k2":1,"k3":["hello","python"]}
n2 = copy.copy(n1)

3.深拷贝
深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:Python内部对字符串和数字的优化)
import copy
n1 = {"k1":"nullnull","k2":1,"k3":["hello","python"]}
n2 = copy.deepcopy(n1)

我的Python升级打怪之路【三】:Python函数的更多相关文章
- 我的Python升级打怪之路【一】:python的简单认识
Python的简介 Python与其他语言的对比: C和Python.Java.C# C语言:代码直接编译成了机器码,在处理器上直接执行 Python.Java.C#:编译得到相应的字节码,虚拟机执行 ...
- 我的Python升级打怪之路【七】:网络编程
Socket网络套接字 socket通常也称为"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过”套接字“向网络发出请求或者应答网络请求. socket起源于 ...
- 我的Python升级打怪之路【六】:面向对象(二)
面向对象的一些相关知识点 一.isinstance(obj,cls) 检查实例obj是否是类cls的对象 class Foo(object): pass obj = Foo() isinstance( ...
- 我的Python升级打怪之路【六】:面向对象(一)
面向对象的概述 面向过程:根据业务逻辑从上到下写代码 函数式:将其功能代码封装到函数中,日后便无需编写,仅仅调用即可 [执行函数] 面向对象:对函数进行分类和封装.[创建对象]==>[通过对象执 ...
- 我的Python升级打怪之路【五】:Python模块
模块,是一些代码实现了某个功能的集合 模块的分类: 自定义模块 第三方模块 内置模块 导入模块 import module from module.xx.xx import xx from modul ...
- 我的Python升级打怪之路【四】:Python之前的一些补充
字符串的格式化 1.百分号的方式 %[(name)][flags][width].[precision]typecode (name) 可选,用于选择指定的key flags 可选,可供选择的值有: ...
- 我的Python升级打怪之路【二】:Python的基本数据类型及操作
基本数据类型 1.数字 int(整型) 在32位机器上,整数的位数是32位,取值范围是-2**31~2--31-1 在64位系统上,整数的位数是64位,取值范围是-2**63~2**63-1 clas ...
- gitlab 迁移、升级打怪之路:8.8.5--> 8.10.8 --> 8.17.8 --> 9.5.9 --> 10.1.4 --> 10.2.5
gitlab 迁移.升级打怪之路:8.8.5--> 8.10.8 --> 8.17.8 --> 9.5.9 --> 10.1.4 --> 10.2.5 gitlab 数据 ...
- Python全栈之路4--内置函数--文件操作
上节重点回顾: 判断对象是否属于某个类,例如: 列表中有个数字,但是循环列表判断长度,用len会报错;因为int不支持len,所以要先判断属于某个类,然后再进行if判断. # isinstance(对 ...
随机推荐
- Alpha冲刺(五)
Information: 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Details: 组员1 柯奇豪 过去两天完成了哪些任务 基于ssm框架的前后端交互测试,结合微信小 ...
- 打开页面默认弹出软键盘,同时兼容iOS和Android
// 示例1 open_soft_keyboard({ input: "#username" }); // 示例2 open_soft_keyboard({ input: 'inp ...
- Android-获取网络图片设置壁纸
下载图片,设置壁纸 的代码: package liudeli.async; import android.app.Activity; import android.app.ProgressDialog ...
- 面试题:给定一个函数rand()能产生1到m之间的等概率随机数,产生1到n之间等概率的随机数?
虽然TX的面试已经过去好几天了,然而惨痛的过程还历历在目.人生中第一次正式job面试就这么挂掉了.在于面试官的交流过程中,被问及了几个算法设计题,在今后几篇博文中,我一一总结与诸君分享. 1. 给定一 ...
- ajax 多个setInterval进行ajax请求的页面长时间打开会出现页面卡死问题
多个setInterval进行ajax请求的页面长时间打开会出现页面卡死问题 浏览器的渲染(UI)线程和js线程是互斥的,在执行js耗时操作时,页面渲染会被阻塞掉.当我们执行异步ajax的时候没有问 ...
- Data Base oracle常见错误及解决方案
Data Base oracle常见错误及解决方案 一.TNS协议适配器错误: 原因: 此问题的原因都是由于监听没有配置好. 解决: 1.打开oracle工具Net Manager,删除服务及监听,重 ...
- idea debug 启动慢出现假死
断点设置不合理引发应用启动慢问题java idea应用启动很慢|非常慢|超级慢的问题排查! 解决关于应用启动超慢这个问题,其实两年前就已经遇到过,https://blog.csdn.net/li396 ...
- JavaScript Debug 之 Console
简评:只知道 console.log ?是时候提升一下对 console 的认知了. JavaScript console 是现代浏览器的一种内置功能,它允许开发者: 查看网页上的错误和警告日志. 使 ...
- Java实现文件重命名
最近在做一个Android上面的一个文件管理器的apk,有文件名重命名和剪切的功能. 一般的思路如下: 重命名:先新建一个文件,复制原先的文件,读写文件,最后删除原先文件 剪切:先复制原先的文件,删除 ...
- Python3之 contextlib
Python中当我们们打开文本时,通常会是用with语句,with语句允许我们非常方便的使用资源,而不必担心资源没有关闭. with open('/path/filename', 'r') as f: ...