热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

学习日志(三)Python函数

1.函数的定义及使用2.参数传递2.1参数类型3.return返回值4.变量作用域5.python匿名函数练习5.1filter函数5.2map函数5.3reduce函数6.函数扩


    • 1.函数的定义及使用
    • 2.参数传递
      • 2.1参数类型
    • 3.return返回值
    • 4.变量作用域
    • 5.python匿名函数
    • 练习
      • 5.1 filter函数
      • 5.2 map函数
      • 5.3 reduce函数
    • 6. 函数扩展
    • 7. 函数对象
    • 8. 函数闭包
    • 9. 装饰器
    • 练习



这里写图片描述

函数知识点思维导图




1.函数的定义及使用

函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。

def 函数名(args,*args,**args):#args元组,**args字典函数内容return something#选择性地返回一个值给调用方。不带表达式的return相当于返回 None

创建和调用函数

def funB(a):a=3return a
a=2
print('调用前',id(a))
print(id(funB(a)))
print('调用后',id(a))def funcB(mylist):mylist.append(100)print('修改后的mylist:',mylist)return
mylist=[10,20,30]
print('调用前mylist:',mylist)
funcB(mylist)
print('调用后mylist:',mylist)

2.参数传递

python中对一个函数可以传递参数,
但是如何分辨是值传递还是引用传递,不是程序员手动控制的,而是Python根据你传入的数据对象,自动识别的.
如果传入的参数是可变对象:列表,字典,这时候为引用传递

python中对一个函数可以传递参数,但是如何分辨是值传递还是引用传递,不是程序员手动控制的,而是python根据你传入的数据对象,自动识别的。
如果你传入的参数对象是可变对象:列表,字典,这个时候就是引用传递,如果参数在函数体内被修改,那么源对象也会被修改。
如果你传入的参数对象是不可变的对象:数字,元组,字符串,这个时候就是值传递。那么源对象是不会改变的


2.1参数类型


  • 必备参数

必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。调用funcA() 函数,你必须传入一个参数,不然会出现语法错误

def funcA(str):#必备参数print(str)returnfuncA('bxfg')

  • 关键字参数

def funcA(name,age):print(name)print(age)returnfuncA(age=30,name='python')

  • 缺省参数

def funcA(name,age=421.3):print(name)print(age)returnfuncA(age=30,name='python')funcA(name='python')

  • 不定长参数

def funcB(x,*args):print(x)print(args)returnfuncB(2,3,4,'python','java',None)args为元组类型def funcB(x,y,z,*args,**kwargs):print(x,y,z)print(args)print(kwargs)returnfuncB(1,2,3,4,5,c=6,a='hello',b=10)

3.return返回值

return语句表示退出函数,在函数中可存在可不存在,当存在时向调用方返回一个表达式的值

def add(a,b):total = a + breturn totalprint(add(10,20))def ass(a,b):total=a+bprint(total)returnass(10,20)

4.变量作用域

作用域分为全局变量及局部变量。定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。


5.python匿名函数

lambda [arg1 [,arg2,…,argn]]:expression

例:

a=lambda : 'rongda'
print(a())a=lambda x: x**2
print(a(10))b=lambda x:[i for i in x if i%2==0]
print(b([1,2,3,4,5,6]))sum1=lambda arg1,arg2:arg1+arg2
print(sum1(10,20))

练习


  1. 输出索引为奇数位的并加入新的列表

def choose(lt):lt1=[]for i in range(len(lt)):if i%2==1:# print(lt[i])lt1.append(lt[i])print(lt1)returnlt=[25,15,231,256,2541,21]choose(lt)

  1. 冒泡法函数表示

def pao(lt):for i in range(len(lt)-1):for j in range(len(lt)-1-i):if lt[j]>lt[j+1]:lt[j],lt[j+1]=lt[j+1],lt[j]print(lt)returnpao([12,453,43,123,153])

  1. 定义一个函数,传入列表并判断其长度,如果大于2,那么仅仅保留前两个长度的内容,并将新内容返回给调用者

def length(lt):if len(lt)>2:lt=lt[0:2]return ltlt=[3,12,43,45,23]print(length(lt))

  1. 定义函数,传入列表或元组对象,并判断所有奇数位索引对应的元素,并将其作为新的列表返回给调用者

def choose(lt):lt1=[]for i in range(len(lt)):if i%2==1:# print(lt[i])lt1.append(lt[i])print(lt1)returnlt=[25,15,231,256,2541,21]choose(lt)

  1. 定义函数,传入字典判断的每一个value的长度,如果大于2,那么仅仅保留前两个长度的内容,并将新内容返回给调用者

def funcdict(**dict1):for i,j in dict1.items():if len(dict1[i])>2:dict1[i]=dict1[i][0:2]print(dict1)returnfuncdict(k1="python",k2=[11,22,33,44,55])

5.1 filter函数

​ filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判, 然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

filter(function , iterable) list1=[1,2,3,4,5,6]
def my_filter(n):return n%2==1
list2=(filter(my_filter,list1))
print(list(list2))#匿名函数
print(list(filter(lambda x:x%2==1,list1)))

5.2 map函数

map的作用是以参数序列中的每一个元素调用 function函数,返回包含每次function函数返回值的list

def add(x,y):return x + y
list1=map(add, [1,3,5,7,9],[2,4,6,8,10])
print(next(list1))
print(next(list1))
print(next(list1))
print(next(list1))
print(next(list1))

5.3 reduce函数

reduce函数会对参数序列中元素进行总体计算。

from functools import reduce
def add(x,y):return x+y
list1=reduce(add, [1,2,3,4,5])
print(list1)

6. 函数扩展

#字符串操作
s='i love you so'
print(s.ljust(30,'*'))#右边补充到30个字符
print(s.rjust(30,'*'))#左边补充到30个字符
print(s.center(30,"*"))#两边进行补充
print(s.zfill(22)) #使用0在开头进行补充
print(s.replace('love','like',1))
print(s.replace('o','O',3))#替换字符
print(s.split('y'))#切割函数,返回值为列表
print(s.capitalize())#整个字符串中首字母大写
print(s.title())#字符串中每个单词的首字母大写
print(s.swapcase())#字符串中每一个字母大小写反转
print(s.count('love'))#统计字符串中字符的数目
print(s.startswith('i'))#匹配第一个字符,判断字符串第一个字符是否与所传字符相同,返回结果为Boll值
print(s.endswith('o'))#匹配最后字符,判断字符串最后一个字符是否与所传字符相同,返回结果为Boll值
print(s.isalnum())#判断字符串中是否包含数字,返回Boll值
print(s.isalpha())#判断字符串中是否全为字母,返回Boll值,包含空格等其他字符也会返回False
print(s.islower())#判断字符串中是否都为小写字母
print(s.isupper())#判断字符串中是否都为大写字母
print(s.istitle())#判断每个单词的首字母是否为大写#列表操作
lt = [1,125,3]
print(lt.index(2))#返回元素对应的索引值
lt.reverse()#反转列表
print(lt)
lt[::-1]#同反转列表
print(lt)
lt.sort()#从小到大排
print(lt)
d={'name':'abc','age':123}
print(d.keys())#取出键
print(d.values())#取出值

7. 函数对象

def funcF(x,y,z):print(x,y,z)
funcF(1,2,3)
funcF.b='hello python'
print(funcF.b)#加点.的方法来给函数对象增加属性

8. 函数闭包

1、概念: 在一个外函数中定义了一个内函数

​ 内函数里运用了外函数的临时变量

​ 并且外函数的返回值是内函数的引用

2、作用:保存函数的状态信息,使函数的局部变量信息依然可以保存下来

def outer(a):#外函数b=10def inner():#内函数print(a+b)return inner#外函数的返回值是内函数的引用
demo=outer(5)
demo()
#或
outer(5)()

9. 装饰器

装饰器的作用是为已存在的函数添加新的功能,缓存,权限等方面运用


  1. 通过变量调用该函数

    def hello():print('我是最初的hello函数')
    f=hello
    f()
    print(hello.__name__)

  2. 函数对象有一个name属性,可以获取函数的名字

    print(hello.__name__)

  3. 假设增加hello()函数的功能,且完全不改变原来的代码,并完成功能的添加:用@语法,把装饰器至于函数的定义处

    def outer(fune):def inner(*args,**kwargs):print('我是%s()函数'%fune.__name__)return fune(*args,**kwargs)return inner
    @outer#写在谁的前面即装饰哪个函数
    def hello():print('我是最初的helllo函数')
    hello()


练习

一.定义一个函数,需求:去除列表中重复的元素

def dele(ls):lm=[]for i in ls:if i not in lm:lm.append(i)return lm
ls=[2,13,2,45,13,2,45,13]
print(dele(ls))

二.定义一个函数,需求:合并两个列表

def reunion(x,y):for i in y:x.append(i)return x
x=[1,2,34,56]
y=[3,56,12,78]
print(reunion(x,y))

三.定义一个函数, 需求:判断三个数中的最大值

def compare(ls):ls.sort(reverse=True)return ls[0]
ls=[12,58,25]
print(compare(ls))

四.定义一个函数, 需求:实现斐波那契数列

def fei(n):ls=[]a,b=0,1while b return ls
n=10000
print(fei(n))

五.lt = [{‘name’:’a’,’age’:20},{‘name’:’b’,’age’:50},{‘name’:’c’,’age’:12}], 请将lt 中元素的age 由大到小排序

lt = [{'name':'a','age':20},{'name':'b','age':50},{'name':'c','age':12}]
lt.sort(key=lambda x:x['age'], reverse=True)
print(lt)

六.将字符串:”k:1|k1:2|k2:3|k3:4”,处理成 python 字典:{‘k’:’1’, ‘k1’:’2’, ‘k2’:’3’,’k3’:’4’ }

s='k:1|k1:2|k2:3|k3:4'
s_list = s.split('|')
# print(s_list)
d={}
for i in s_list:key, value = i.split(':')# print(key,value)d[key] = value
print(d)

推荐阅读
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了[从头学数学]中第101节关于比例的相关问题的研究和修炼过程。主要内容包括[机器小伟]和[工程师阿伟]一起研究比例的相关问题,并给出了一个求比例的函数scale的实现。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
author-avatar
诗雨妈咪201101102002
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有