深入理解python(四)python基础知识之函数

函数部分

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

函数的参数

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

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

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

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

例:

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

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

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

例:

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

2.几个参数类型

a.默认值参数

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

例:

def power(x, n=2):
  s = 1
  while(n > 0):
    n -= 1
    s *= n
  reutrn s

power(3)  #9
power(2, 3) #8

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

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

>>> def my_func(a=[]):
...    a.append(1)
...    print(a)
>>> my_func()
[1]
>>> my_func()
[1, 1]
>>> my_func()
[1, 1, 1]

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

b.可变长参数

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

>>> def my_func(*a):            #*parameter
...     for x in a:
...         print(x)
...
>>> my_func(1,2,3)
1
2
3
>>> def my_func(**a):         #**parameter
...         print(a)
...
>>> my_func(a=1,b=2)
{‘a‘: 1, ‘b‘: 2}

d.参数的解包

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

#解包--list,元组,集合
def connect(ip,port,username,password):
    print(ip)
    print(port)
    print(username)
    print(password)

info_list=[‘192.168.1.1‘,3309,‘zhaozhao‘,‘123456‘]
info_tuple=(‘192.168.1.1‘,3309,‘zhaozhao‘,‘123456‘)
info_set={‘192.168.1.1‘,3309,‘zhaozhao‘,‘123456‘}

connect(*info_list)
connect(*info_tuple)
connect(*info_set)

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

dic={"name":"zhaozhao","password":"123456"}

def dic_fun(name,password):
    print(name)
    print(password)

dic_fun(**dic)

zhaozhao

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

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

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

lambda表达式和几个常用函数

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

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

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

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

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

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

from functools import reduce

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

之后是关于sort的东西:

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

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

>>> a=[2,4,3,1]
>>> a.sort()
>>> a
[1, 2, 3, 4]
>>> a=[2,4,3,1]
>>> b=sorted(a)
>>> b
[1, 2, 3, 4]
>>> a
[2, 4, 3, 1]

之后是python2和python3的区别:

先说说这几个参数:

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

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

关于key,这里给个例子:

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

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

Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> cmp(1,2)          #注意这是在在python2环境下
-1
>>> cmp(2,1)
1

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

#升序排列
>>>numbers = [5,2,9,7]
>>>numbers.sort(cmp = lambda x,y: x-y)
>>>numbers
[2,5,7,9]

#降序排列
>>>numbers = [5,2,9,7]
>>>numbers.sort(cmp = lambda x,y: y-x)
>>>numbers
[9,7,5,2]

最后关于yeild的使用

这里先简述一下generator的概念

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

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

例如使用生成器表达式:

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

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

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

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

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

 

原文地址:https://www.cnblogs.com/halaya/p/12294383.html

时间: 2024-08-25 08:58:23

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

Python网络爬虫基础知识学习

对Python有一些简单了解的朋友都知识Python编程语言有个很强大的功能,那就是Python网络爬虫(http://www.maiziedu.com/course/python/645-9570/),一提到Python,就会想到相关的Python爬虫和scrapy等等,今天就来简单认识学习Python爬虫的基础知识,有了一定的相关爬虫知识,以后学习scrapy.urllib等等知识时,会相对轻松些. 爬虫: 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组

[Python学习] 专题四.文件基础知识

        前面讲述了函数.语句和字符串的基础知识,该篇文章主要讲述文件的基础知识(与其他语言非常类似). 一. 文件的基本操作         文件是指存储在外部介质(如磁盘)上数据的集合.文件的操作流程为: 打开文件(读方式\写方式)->读写文件(read\readline\readlines\write\writelines)->关闭文件 1.打开文件 调用函数open打开文件,其函数格式为: file_obj=open(filename[, mode[, buffering]])

python的一些基础知识1(共计10)

python现在很热门,我们公司是一个教育机构也对这个很热门的东西情有独钟,我打算从今天开始用十节课的内容给大家讲解一下pathon的基础知识. 首先需要记住一些必备的尝试: 1:退出python交互式解释器的快捷键是CTRL+D 2:如果熟悉其他计算机语言,可能习惯性的在每行后以分号结束,python则不用,一行就是一行,不管多少,如果喜欢的话可以加上分号,但是不会起到任何作用. 3:在python中参与出发运算的两个数如果有一个是浮点数则运算结果就是浮点数,两个数如果都是整数则运算结果也为整

Python基础知识之函数、模块

1.Python模块. Python一个.py后缀的文件,称为模块.Python模块可以包含变量.函数.类,同时类中又可以定义变量和函数. 2.Python模块导入. (1) Python模块全部导入方式:from 模块名 import * (2) Python模块按需导入方式:from 模块名 import 函数名/类名 3.函数.常用函数如下. str(o):将数字转化为字符串函数, int(o):将字符串转化为数字函数. format():字符串格式化函数. replace:字符串替换函数

Python学习心得——基础知识(四)

数据类型 一.字符串(str) 1.让字符串小写变成大写 a=‘hello' b=a.upper() 2.让字符串大写变成小写 a=‘HELLO’ b=a.lower() 3.快速查看对象的类有哪些方法 a=‘abc' b=dir(a) 也就是快速查看字符串类有哪些方法 4.查看对象的类有哪些详细的方法 a=‘abc' b=help(type(a)) 二.整数(int) 1.bit_length()  获取数字转换成二进制可表示的最短位数 a=4 二进制:00000100 a.bit_lengt

PYTHON之计算机语言基础知识 —— 编程语言的分类

一.计算机语言分类 低级语言.高级语言.专用语言.脚本语言 1.低级语言:机器语言.汇编语言和符号语言.机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令(机器码)的合集,他是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能:汇编语言(亦称符号语言)用助记符代替机器指令的操作码,汇编语言源程序必须经过汇编生成目标文件,然后执行. 2.高级语言:主要是相对汇编语言而言,它更接近自然语言和数学公式的编程,基本脱离了机器的硬件系统,用人们更易理解的方式编写程序,编写的程序称为源程序

python的一些基础知识

什么是算法? 算法就是计算机执行时的步骤,对于某一件事的详细描述.(事无巨细,全部考虑到,务必做到无遗漏,但是这是不可能的) 交互式解释器 python在启动是用于用户输入和程序返回结果的程序就是交互器. 十六进制,二进制 此处不做详细赘述,会更新整篇文章对此概念进行概述. 变量 变量就是一些数值的名字,也可以理解为容器.变量的命名不能使用数字开头,不能使用关键字,不能以下划线开头,在工作使用中,一般把大写字母命名的变量定义为全局变量,不能更改.变量在命名的时候遵循意义明显的原则的,名字就能代表

Python学习心得——基础知识(六)

一.lambda表达式 1.定义 针对简单的函数,用lambda表达式来展现更方便. 2.样例 1 #普通函数 2 def f1(a): 3 return a+1 4 print(f1(7)) 5 6 #用lambda表达式来实现 7 8 f2=lambda a: a+1 9 print(f2(7)) 二.python内置函数 1.常见内置函数表 2.需要熟练掌握的内置函数如下 abs(),all(),any(),bin(),bool(),bytes(),chr(),dict(),dir(),d

Python学习心得——基础知识(七)

一.冒泡排序 1.要求 把列表中无序的字符按小到大排序:[9,6,15,11,36,28] 2.思路 把列表中相邻的字符值进行排序,值的放到右侧,逐个比较直到满足要求,类似水中的气泡朝水面移动. 3.样例 针对列表[9,236,1,7,5,18]按从小到大排序 1 #!usr/bin/env python 2 # -*- coding: utf-8 3 4 lis=[9,236,1,7,5,18] 5 for i in range(1,len(lis)): #判断有几次大循环数据比较 6 for