python-函数

函数的基本概念

写一段代码实现某个小功能, 将代码集中在一起,做一个命名,下次直接根据命名名称使用这个代码块,这就是函数

作用
  1. 方便代码重用
  2. 分解任务,简化程序逻辑
  3. 使代码更加模块化
函数分类
  1. 内建函数: python中已经存在的函数
  2. 三方函数: 其他人写的函数,我们可以直接调用
  3. 自定义函数:自己根据需求编写的函数

函数的定义和调用

定义函数的语法:

def  函数名 ([参数列表]) :
    '''文档字符串'''
    函数体/若干语句

简述:

  1. 使用def来定义函数,然后就是一个空格和函数名称,python执行def时,会创建一个函数对象,并绑到函数名变量上
  2. 括号内的参数有多个时用逗号隔开,调用时参数必须和参数列表一一对应、
  3. 如果函数需要返回数据,可以使用return语句返回值,不包含return语句则返回None

调用函数:
先定义函数,也就是先使用def创建函数对象,当然内置函数对象是会自动创建的
创建完函数对象,可以直接使用函数名称进行调用

参数

形参和实参

形参分为: 位置参数,默认参数,可变参数,关键字参数
形参是在定义函数时给出的变量,实参是调用函数时传递的真实数据

位置参数

形参和实参必须保持一致,最好按位置传参,如果位置不对应需要指定说明

def register(name, age):
    print(name, age)

# 正确传参方法
register('zhangsan', '18')
register(age='18', name='zhangsan')
# 错误传参方法
register('18', 'zhangsan')
默认参数

形参和实参可以不一致,如果不想使用默认的参数,在调用函数的时候可以指定
调用函数的时候,如果默认参数的值没有传入,则直接使用默认值

def register(name, age=18):
    print(name, age)

register('zhangsan')
register('zhangsan', age=20)
可变参数

形参参数名前面加*,可变参数可允许传入0个或者任意个参数,这些可变参数在函数调用时,自动组装成一个元组

def register(*name):
    print(name)
    
register('zhangsan', 'lisi', 'wangwu')
关键字参数

**kwargs代表关键字参数,可以传入任意多个key-value,是一个字典

def register(name, age, **kwargs):
    print(name, age, kwargs)

register('zhangsan', 18, a=1, b=2)

c = dict(a=1, b=2)
register('zhangsan', 18, **c)

变量的作用域

局部变量

函数内使用的变量,只能在函数内使用

  1. 调用函数时,函数作用域创建,函数执行完毕,作用域销毁
  2. 每次调用函数都会创建一个新的函数作用域
  3. 函数作用域内可以访问到全局作用域的变量,但是函数外无法访问函数内的变量
  4. 函数作用域内访问变量或者函数,会从内到外逐层寻找,一直到全局作用域
  5. 函数作用域内也有声明提前的特性,对变量和函数都适用,此时函数作用域相当
全局变量

函数外定义的变量,可以在不同函数内使用

  1. 在页面打开时创建,页面关闭时销毁
  2. 编写在script标签中的变量和函数,作用域作为全局,在页面的任意位置都可以访问到
  3. 在全局作用域中有全局对象window,代表一个浏览器窗口,由浏览器创建,可以直接调用
  4. 全局作用域中声明的变量和函数会作为window对象的属性和方法保存
全局变量和局部变量效率测试

局部变量的查询和访问速度比全局变量快,优先考虑使用,尤其是在循环的时候
在特别强调效率的地方或者循环次数较多的地方,可以通过将全局变量转为局部变量提高运行速度

import math
import time

def test1():
    start = time.time()
    for i in range(10000000):
        math.sqrt(30)
    end = time.time()
    print("耗时{0}".format((end - start)))

def test2():
    b = math.sqrt
    start = time.time()
    for i in range(10000000):
        b(30)
    end = time.time()
    print("耗时{0}".format((end - start)))

test1()
test2()
----------------------------------
耗时0.847449541091919
耗时0.6533384323120117

深拷贝和浅拷贝

浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用

浅拷贝的方法
  1. 通过数据类型本身的构造器,例如 list set dict
  2. 对于可变序列,可以使用切片操作完成浅拷贝
  3. 使用copy.copy()函数完成,适用于任何数据类型
特征
  1. 构造器完成的浅拷贝,因为实际上是新分配了一块内存,所以和原来的变量内存不一样,直接==判断为false,但是两个变量的元素值是一样的
  2. 元组使用切片操作或者tuple()不会创建一份浅拷贝,因为它开辟新的内存存储的是原对象的引用,而没有创建新的对象来存储原对象的子对象的引用,所以不是浅拷贝。相反它会返回一个指向相同元组的引用。对字符串使用 str() 或者切片操作符 ‘:’,原理和 元组相同

深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联
以 copy.deepcopy() 来实现对象的深度拷贝

递归函数

什么是递归

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数

  1. 递归函数必须有一个明确的结束条件
  2. 每进入更深一层的递归时,问题规模相对于上一次递归都应减少
  3. 相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)
  4. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

看个例子,比如我们用循环来实现叠加:

def sum1(n):
    sum = 0
    for i in range(1,n + 1):
        sum += i
    return sum

如果用递归来实现的话

def sum2(n):
    if n > 0:
        return n + sum2(n - 1)
    else:
        return 0

看这个例子大概能理解递归函数是什么,怎么写了,那递归函数有什么有缺点呢

递归函数的优缺点

首先,优点:定义简单,逻辑清晰
理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
缺点: 使用时需要注意防止栈溢出
在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

Lambda函数

lambda函数也叫匿名函数,即,函数没有具体的名称

def f(x):
    return x ** 2
print(f(4))

g = lambda x: x ** 2
print(g(4))

lambda函数和普通的函数相比,其实就是省去了函数名称,同时这样的匿名函数,又不能共享在别的地方调用

Lambda的作用
  1. 使用Python写一些执行脚本时,使用lambda可以省去定义函数的过程,让代码更加精简
  2. 对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题
  3. 使用lambda在某些时候让代码更容易理解
Lambda基础

lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值

from functools import reduce

foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
print(filter(lambda x: x % 3 == 0, foo))
print(map(lambda x: x * 2 + 10, foo))
print(reduce(lambda x, y: x + y, foo))
----------------------------------
<filter object at 0x0000025F8F43FFA0>
<map object at 0x0000025F8F43FFD0>
139

在对象遍历处理方面,其实Python的for…in…if语法已经很强大,并且在易读上胜过了lambda。
defaultdict是字典类型,可以为defaultdict设置默认值,可以通过lambda设置默认值

from collections import *
x = defaultdict(lambda:0)
print(x[0])
y =defaultdict(lambda:defaultdict(lambda:0))
print(y[0])
z = defaultdict(lambda:[0,0,0])
print(z[0])
----------------------------------
0
defaultdict(<function <lambda>.<locals>.<lambda> at 0x000001BC7C427DC0>, {})
[0, 0, 0]

eval() 函数

eval() 函数用来执行一个字符串表达式,并返回表达式的值

语法

eval(expression[, globals[, locals]])

expression – 表达式。
globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals–变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
返回值:返回表达式计算结果。

举例
n = input()
m = eval(input())
print(type(n))
print(type(m))
print(type(eval(n)))

在这里插入图片描述
使用eval()函数,将字符串还原为数字类型,和int()函数的作用类似

m = input()
n = eval(input())
print(type(m))
print(type(n))
print(type(n[0]))

在这里插入图片描述
将输入的字符串转为对应的数据类型,列表、元组等数据类型都可以使用这种方式输入

s1 = '3*7'
s2 = 'pow(2,3)'
n = eval(s1)
m = eval(s2)
print(n, m)

在这里插入图片描述
对表达式的结果进行计算,返回计算后的值

基于遗传算法改进BP神经网络的电池容量SOC预测 ,遗传算法BP神经网络能很好的实现对电池容量soc的训练和预测,BP神经网络是一种成熟的神经,相对于其他神经网络,拥有很多的训练函数,传递函数,可以调节的参数非常多,对各种问题都可以达到一个比较理想的效果,关键看如何调试参数,选择训练传递函数,遗传算法改进BP神经网络的初始权值阈值,达到改进BP神经网络的目的,从而更好的实现对电池容量SOC的预测 阅读详情

相关推荐

深入解析SAP MM模块OBYC自动科目分配机制:从T030表到实战配置

本文深入解析SAP MM模块中OBYC自动科目分配机制,阐明其作为连接物流与财务核心桥梁的作用。文章以T030表为核心,详细拆解其字段结构与检索逻辑,并通过采购收货、生产发料等实战场景,手把手演示配置步骤与关键要点,帮助读者掌握从原理到实践的完整知识体系,实现业财无缝对接。

nft7creator的博客 358

python利用eval方法提升dataframe运算性能

eval方法可以直接利用c语言的速度,而不用分配中间数组,不需要中间内存的占用. 如果包含多个步骤,每个步骤都要分配一块内存 import numpy as np import pandas as pd import timeit df = pd.DataFrame({'a': np.random.randn(10000000), 'b': np....

花花公子 2142

SOI技术实战:从晶圆结构到芯片性能提升的完整解析

本文深入解析SOI(Silicon on Insulator)技术如何通过独特的三明治晶圆结构提升芯片性能,涵盖从220nm SOI层设计到7nm节点的工艺挑战。详细探讨了埋氧层的绝缘优势、性能提升的物理机制,以及AMD处理器和5G射频中的实战应用,为半导体行业提供关键技术洞见。

wdx0123456的博客 960

Python:eval的妙用和滥用

eval()函数

wangato的博客 2027

股票分时数据获取-东方财富

获取下股票分时数据,分时均价下线,分时成交额等,用于量化t0交易条件还是很不错了的。

meiaoxue1234的博客 1万+

ubuntu20.04开机黑屏卡在/dev/sda1:clean,***files,***blocks,解决心得记录

这个问题如果你百度,会发现目前有很多种解决方法。 有更新显卡驱动的,有卸载上一次安装软件的,还有各种奇奇怪怪的故障原因。 如果你是属于上述情况,那么按照百度和论坛的各种指引操作一般都能解决。 但我这里主要说一种特殊情况,就是我什么也没有操作,我什么也没干。就是正常使用系统关了机突然就报错了。 这也是自己亲自遇到的问题,做个小记录方便以后自己回顾。 上一次出现这种情况我重装系统了,这次用了两个月又出现了,重装成本太高,我接受不了,于是找到解决办法。 首先找个终端进入,进入终端的方法很多,用安装u盘

qq_41517017的博客 2万+

Python的eval()和int()的几点区别和性能差异

-

zorchp 2406

【论文汇总】Diffusion Models视频生成/视频编辑/可控视频生成/跨模态视频生成

本文总结了Diffusion Models视频生成领域相关的工作,目前共收录142篇,持续更新中。

沉迷单车的追风少年 1672

Python 在大数据处理下的优化(一)用json.loads比eval快10倍!!

eval 跟json.loads 是不一样的函数,是有实现不一样功能的地方,但是在某些地方它们两个函数的功能是一样的,在这个时候如果对执行效率有一定要求的话,建议不要用eval,改用json.loads会有惊喜哦。 一、eval eval() 函数用来执行一个字符串表达式,并返回表达式的值。 二、json.loads json.loads 用于解码 JSON 数据。该函数返回 Python 字段的...

qq_35869630的博客 2894

西门子V90伺服——章节0、西门子V90章节总述

格式规范:西门子V90伺服——章节1、产品介绍(1、伺服系统初步介绍)@[TOC](西门子V90伺服——章节1、产品介绍)课时1伺服系统初步介绍(1)课时2 伺服系统初步介绍(2)课时3 运动控制基础(1)课时4 运动控制基础(2)课时5 产品概览课时6 相关选件课时7 控制模式介绍(1)课时8 控制模式介绍(2)课时9 产品选型课时10 调试工具及相关资料介绍。

大小曲奇的博客 123

JEDEC 标准半导体功率循环热阻测试(JESD51 系列)

【代码】JEDEC 标准半导体功率循环热阻测试(JESD51 系列)

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 468

eval

点击打开链接 eval(str [,globals [,locals ]])函数将字符串str当成有效Python表达式来求值,并返回计算结果。 同样地, exec语句将字符串str当成有效Python代码来执行.提供给exec的代码的名称空间和exec语句的名称空间相同. 最后,execfile(filename [,globals [,locals ]])函数可以用来执行

一世辛劳的专栏 638

手把手教你学PCIE--所有 PF(Physical Function)共同管理和分配 VF

但具体如何分配和使用 VF 取决于硬件设计、驱动程序配置以及实际应用场景。

MHD0815的博客 1462

Python函数总结

本章总结了python中函数的基础知识点

2403_86719076的博客 1704

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python中各种函数的用法,python常用函数大全

大家好,小编来为大家解答以下问题,python中各种函数的用法,python常用函数大全,现在让我们一起来看看吧!

a17348的博客 1026

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

python content函数_python函数内容

在刚接触python的时候就有个疑问,什么是函数? python语言的函数和数学语言的函数有区别吗?什么是函数数学函数:给定一个数集A,假设其中的元素为x。现对A中的元素x施加对应法则f,记作f(x),得到另一数集B。假设B中的元素为y。则y与x之间的等量关系可以用y=f(x)表示python函数:函数就是一段事先组织好的,它具有可重复性,封装好,用来实现某个相关联功能的代码段,函数能提高应用的模...

weixin_39732316的博客 4173

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python中各种函数的用法,python中常见的函数

30. ords()和chr(ASCII)函数:将字符串转化为ASCII或将ASCIIIS\转化为字符串。20. urllib.urlopen(url).read():打开网络内容并存储。6. int()函数、float()函数、str()函数等:类型的转化函数。32. strip()、lstrip()、rstrip()函数:去除空格。49. list.remove(“s”)函数:将数据中第一次出现的s删掉。44. s.insert(3,-1)函数:在3的位置之前插入数据-1。

zjl102562的博客 1037

Python函数

函数体#进行一些操作def用于声明一个函数,告诉python这是一个函数的定义。:函数名,一个有效的标识符,命名规则和变量名一致。parameters:形参,可以是0 ~ n 个,参数之间用逗号分隔。函数体:定义函数执行的具体操作。return:指定函数的返回值,没有则返回None。return后面的代码不会执行。lambda函数通常用在需要一个短小函数的地方。

bright_colo的博客 967

python 函数嵌套函数_Python中的嵌套函数

python 函数嵌套函数A nested function is simply a function within another function, and is sometimes called an "inner function". There are many reasons why you would want to use nested functions, and we'll g...

2873

python函数怎么打_python ln函数怎么打

在python语言中,ln函数不是直接调用ln,而是调用math包中的log,或cmath包中的log。工具/原料pythonpycharm截图工具台式机ppt2019方法/步骤1打开pycharm工具,在指定包中新建python文件2在新建的python文件中,导入math和cmath包,然后使用dir查看对应包的方法3保存代码并直接使用应用运行,控制台查看打印结果4调用math包中的log函数...

weixin_39984442的博客 1万+

python子函数怎么写_python函数写法

len(x) 击败 x.len(),从内置函数看 Python 的设计思想内置函数是 Python 的一大特色,用极简的语法实现很多常用的操作。它们预先定义在内置命名空间中,开箱即用,所见即所得。Python 被公认是一种新手友好型的语言,这种说法能够成立,内置函数在其中起到了极关键的作用。举个例子,求字符串 x 的长度,Python 的写法是 len(x) ,而且...文章python猫2019...

weixin_39526564的博客 2919

python download函数_python 函数

函数对象在面向对象编程中 一切皆对象具体的体现1.函数可以被引用2.函数可以作为函数的参数3.函数可以作为函数的返回值4.可以被存储到容器类型中defpay():print('支付')defsave():print('存钱')defcheak():print('查看')dic={'1':pay,'2':save,'3':cheak}whileTrue:l=['支付','存钱','查看']for i...

weixin_39522423的博客 2418

python中各种函数的用法,python基本函数有哪些

大家好,小编为大家解答python中各种函数的用法的问题。很多人还不知道python基本函数有哪些,现在让我们一起来看看吧!

2401_82891133的博客 940

python var函数_Python 函数

Python中函数使用def定义的函数还有就是lambda 定义的函数。使用def关键字声明的函数,返回使用return关键字,如果到达函数仍然没有遇到return语句,就会自动返回None.a = Nonedef bind_var():a = []for i in range(5):a.append(i)print(a)print(bind_var())函数有两种连接变量的方式:全局变量,本地变...

weixin_42397925的博客 2981

python编写函数calsum_Python函数

Python函数1.函数定义def 函数名(参数表列):"""函数文档(函数功能描述):param 参数名1:参数1描述:param 参数名2:参数2描述......:return: 函数返回描述"""函数体return 返回值2.模块调用import 模块名 as 新的模块名新的模块名.方法名(参数表列)3.函数参数必须参数必须以正确的顺序传入,且调用时必须与生明时保持一致。def f(name...

weixin_39575565的博客 1983

python如何定义函数k_Python 函数

Python 函数定义一个函数你可以定义一个由自己想要功能的函数,以下是简单的规则:函数代码块以def关键词开头,后接函数标识符名称和圆括号()。任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。函数内容以冒号起始,并且缩进。return [表达式]结束函数,选择性地返回一个值给调用方。不带表达式的return相当于...

weixin_29867767的博客 1356
上一篇: python - 递归函数
下一篇: python 整数 - 基本数据类型
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值