函数部分

函数部分大概想分成两个部分来讲,第一部分是关于对函数参数的介绍,第二部分是局部变量全局变量和内置变量也就是变量作用域的LGB原则

函数的参数

1.关于形参和实参的问题

第一点要注意的是python中形参和实参的问题、

以不可变对象为参数,不会修改不可变对象的值(形参和实参的原因)

但对于可变对象(例如列表字典等),会在原地修改对象的值

例:

  1. >>> def immutableob(a):#在函数中修改不可变对象的值
  2. ... a+=
  3. >>> b=
  4. >>> immutableob(b)
  5. >>> b
  6. #对象的值并没有改变

所以一般需要改变不可变对象的时候,一般使用返回值来处理

但是对于可变对象,函数内部值的改变会影响到外部

例:

  1. >>> def mutableob(a):
  2. ... a[]=
  3. ...
  4. >>> b=[,,]
  5. >>> mutableob(b)
  6. >>> b
  7. [, , ] #作为参数的不可变对象的值发生了改变

2.几个参数类型

a.默认值参数

调用函数时,设置一些有默认值的参数

例:

  1. def power(x, n=):
  2. s =
  3. while(n > ):
  4. n -=
  5. s *= n
  6. reutrn s
  7.  
  8. power() #
  9. power(, ) #

但是不建议默认值参数指向一个可变对象,很容易出现危险

这里给一个默认值对象指向空列表的例子

  1. >>> def my_func(a=[]):
  2. ... a.append()
  3. ... print(a)
  4. >>> my_func()
  5. []
  6. >>> my_func()
  7. [, ]
  8. >>> my_func()
  9. [, , ]

可以看到,这样做的结果是,默认值参数的值会随着函数运行的次数而不断改变

b.可变长参数

可变长度参数有两种形式:*parameter 和 **parameter
*parameter 用来接受多个实参并将其放在一个元组中
**parameter 用来接受字典形式的实参

  1. >>> def my_func(*a): #*parameter
  2. ... for x in a:
  3. ... print(x)
  4. ...
  5. >>> my_func(,,)
  6.  
  7. >>> def my_func(**a): #**parameter
  8. ... print(a)
  9. ...
  10. >>> my_func(a=,b=)
  11. {'a': , 'b': }

d.参数的解包

列表解包时,保持列表项数与参数数一致

  1. #解包--list,元组,集合
  2. def connect(ip,port,username,password):
  3. print(ip)
  4. print(port)
  5. print(username)
  6. print(password)
  7.  
  8. info_list=['192.168.1.1',,'zhaozhao','']
  9. info_tuple=('192.168.1.1',,'zhaozhao','')
  10. info_set={'192.168.1.1',,'zhaozhao',''}
  11.  
  12. connect(*info_list)
  13. connect(*info_tuple)
  14. connect(*info_set)

字典解包时,使用两个**代表对值的解包,但需要参数名称和key的值一样:

  1. dic={"name":"zhaozhao","password":""}
  2.  
  3. def dic_fun(name,password):
  4. print(name)
  5. print(password)
  6.  
  7. dic_fun(**dic)
  8.  
  9. zhaozhao

这里要注意一下函数解包和变长参数的区别

变长参数是在函数定义时作为形参在函数定义内的

而函数解包相当于把要传入的字典或者列表进行解包,然后作为实参传入函数

lambda表达式和几个常用函数

lambda表达式可以用来声明匿名函数(anonymous function),即没有函数名字的临时使用的小函数
只可以包含一个表达式,且该表达式的计算结果为函数的返回值,不允许包含其他复杂的语句,但在表达式中可以调用其他函数。

  1. >>> x=lambda a,c:a+c
  2. >>> x(,)

常见的使用情景时在map函数中调用

  1. >>> a=[,,,]
  2. >>> list(map(lambda c:c*c,a))
  3. [, , , ]

内置函数reduce可以将一个接受两个参数的函数以累积的方式从左到右依次作用到一个序列或迭代器对象的所有元素上

注意一点,python3在使用reduce时要注意需要

from functools import reduce

  1. >>> reduce(lambda x,y:x+y,[,,,])
  2.  
  3. >>>

之后是关于sort的东西:

首先是list.sort()和sorted()的区别

list.sort()是原地排序,而sorted()是非原地排序返回排完序的列表

  1. >>> a=[,,,]
  2. >>> a.sort()
  3. >>> a
  4. [, , , ]
  5. >>> a=[,,,]
  6. >>> b=sorted(a)
  7. >>> b
  8. [, , , ]
  9. >>> a
  10. [, , , ]

之后是python2和python3的区别:

先说说这几个参数:

reverse -- 排序规则,reverse = True 降序, reverse = False 升序(默认)

key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

关于key,这里给个例子:

  1. >>> a=[(,),(,),(,)]
  2. >>> def mykey(a):
  3. ... return a[]
  4. >>> a.sort(key=mykey)
  5. >>> a
  6. [(, ), (, ), (, )]

关于cmp函数,在python2中作为传入的比对函数来使用,默认函数就是comp(x,y),在python3中没有这个参数

  1. Python 2.7. (v2.7.14:84471935ed, Sep , ::) [MSC v. bit (Intel)] on win32
  2. Type "help", "copyright", "credits" or "license" for more information.
  3. >>> cmp(,) #注意这是在在python2环境下
  4. -
  5. >>> cmp(,)

所以在python2中我们可以任意修改比对规则,例:

  1. #升序排列
  2. >>>numbers = [,,,]
  3. >>>numbers.sort(cmp = lambda x,y: x-y)
  4. >>>numbers
  5. [,,,]
  6.  
  7. #降序排列
  8. >>>numbers = [,,,]
  9. >>>numbers.sort(cmp = lambda x,y: y-x)
  10. >>>numbers
  11. [,,,]

最后关于yeild的使用

这里先简述一下generator的概念

严格来讲,Python中“生成器”这一概念包括两种具体的语法实现:
生成器函数(generator function): 类似于用常规的 def 语句定义的函数,但是使用 yield 语句一次返回一个结果,并在每个结果之间挂起 / 继续执行的状态
生成器表达式(generator expression): 类似于列表解析式,但是它们返回一个迭代器,而不是返回一个结果列表

也可以简单理解为生成一个可迭代对象,,,

例如使用生成器表达式:

  1. >>> for x in (i for i in range(,)):
  2. ... print(x)
  3. ...

这是生成器表达式,我们使用生成器函数做同样的事情

  1. >>> def number(i):
  2. ... for k in range(i):
  3. ... yield k
  4. ...
  5. >>> for x in number():
  6. ... print(x)
  7. ...
  8.  
  9. 4

#我们来看看函数的返回类型

>>> type(number(5))
<class 'generator'>

  1.  

深入理解python(四)python基础知识之函数的更多相关文章

  1. 自学Python四 爬虫基础知识储备

    首先,推荐两个关于python爬虫不错的博客:Python爬虫入门教程专栏   和 Python爬虫学习系列教程 .写的都非常不错,我学习到了很多东西!在此,我就我看到的学到的进行总结一下! 爬虫就是 ...

  2. Python开发(一):Python介绍与基础知识

    Python开发(一):Python介绍与基础知识 本次内容 一:Python介绍: 二:Python是一门什么语言 三:Python:安装 四:第一个程序 “Hello world” 五:Pytho ...

  3. Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现

    Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现 一丶进程基础知识 什么是程序: ​   程序就是一堆文件 什么是进程: ​   进程就是一个正在 ...

  4. Python第一章-基础知识

    第一章:基础知识 1.1 安装python.     直接官网下载最新的python然后默认安装就可以了,然后开始菜单里找到pyhton *.*.* Shell.exe运行python的交互shell ...

  5. 基于Python的Flask基础知识

    Flask简介 Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架.Armin Ronacher带领一个名为Pocco的国际Python爱好者团队开发了Flask. 下面我们简单 ...

  6. Python音频处理基础知识,这不是轻轻松松~~~

    大家好鸭,我是小熊猫 咱今天来讲一讲音频处理的基础知识上才艺~~~ 1.声音的基础 2.python读取.wav音频 欢迎加入白嫖Q群:660193417### import wave import ...

  7. python这不是有手就行?——python音频处理基础知识

    大家应该都知道声音的基础吧? 啊不知道当我没说吧~~~ 1.声音的基础 2.python读取.wav音频 Python学习交流Q群:660193417#### import wave import s ...

  8. Python基础知识:函数

    1.定义函数和调用函数 #定义函数def def greet_user(username): '''简单的问候语''' print('Hello,%s!'%username) greet_user(' ...

  9. python第一课--基础知识

    python简介 Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的 ...

  10. 【Python】【基础知识】【内置函数】【input的使用方法】

    原英文帮助文档: input([prompt]) If the prompt argument is present, it is written to standard output without ...

随机推荐

  1. mui H5+ 调取 相册 拍照 功能 上传图片 + 裁剪功能

    H5+ 相册拍照图片上传 点击用户头像后,弹出actionSheet,选择从相册或是拍照:选取照片后调用上传方法: 上传图片后调用PhotoClip.js  插件进行裁剪 具体流程 弹出actionS ...

  2. Python警告:InsecureRequestWarning、InsecurePlatformWarning、SNIMissingWarning

    SSL警告 urllib3将基于证书验证支持的级别发出几种不同的警告.这些警告表示特定情况,可以通过不同方式解决. InsecureRequestWarning 当在未启用证书验证的情况下对HTTPS ...

  3. AE开发常见问题总结

    一. Arcgis10.0 组件初始化失败解决方法: ESRI.ArcGIS.RuntimeManager.BindLicense(ESRI.ArcGIS.ProductCode.EngineOrDe ...

  4. 基于Python的face_recognition库实现人脸识别

    一.face_recognition库简介 face_recognition是Python的一个开源人脸识别库,支持Python 3.3+和Python 2.7.引用官网介绍: Recognize a ...

  5. rest_framework:url控制

    一.基本路由(原始方式) 二.半自动路由(视图继承ModelViewSet) 三.自动路由(自动生成路由) 准备工作: models中创建一张表,默认使用sqlite数据库,更新表 新增测试数据 加载 ...

  6. Oracle体系结构中基本概念,数据库

    在Oracle体系结构中包含了基本概念即Oracle数据库与实例,如果你想要了解Oracle体系结构的话,你就必须要了解这两个基本的概念,以下是文章的具体介绍,望你浏览完以下的内容会有所收获. 数据库 ...

  7. linq和初始化器

    对象初始化器 在没有初始化器之前,我们初始化一个对象可能需要在构造函数内对属性赋值,或者先实例化一个对象,在一个一个的对其属性赋值. 使用初始化器: 已知类型:var query = new Pers ...

  8. js时间相关操作

    取值 this.divEndDate.attr("value",new Date()); var date = new Date(); date.getYear():     取2 ...

  9. 在多租户(容器)数据库中如何创建PDB:方法1 从种子创建PDB

    基于版本:19c (12.2.0.3) AskScuti 创建方法:从零开始创建一个PDB(从PDB$SEED创建新的PDB) 对应路径:Creating a PDB --> Creating ...

  10. JSON.toJSONString(Object object,SerializerFeature...features)详解

    D package myProject; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; ...