我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python全栈开发之函数

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python全栈开发之函数

No.1 函数介绍

所谓函数,就是把具有独立功能的代码块组织为一个小模块,在需要的时候调用

函数的使用有两个步骤:
1、定义函数
2、调用函数

函数的作用,代码重用,提高开发效率

No.2 定义和调用

定义函数的格式如下:

def 函数名():

    函数封装的代码

def是英文define的缩写

函数名称应该能够表达函数封装代码的功能,方便后续的调用

函数名称的命名应该符合标识符的命名规则

函数调用:

通过函数名()即可完成函数的调用

No.3 普通参数

def func(name): # name是形式参数
    print(name) # 函数体

func('kernel') # 执行函数,'kernel'是实参

No.4 默认参数

定义了默认参数后,在函数调用时不再需要传入,默认参数放在最后面

def info(name,age,country='China') # name,age是普通参数,country是默认参数
    print('name:',name)
    print('age:',age)
    print('国家:',country)

info('kernel',21) # 调用时,没有传入country,就使用默认参数

No.5 关键参数

正常情况下,给函数传递参数需要按照定义的顺序,不想按顺序就要使用关键参数,但是关键参数必须放在普通参数之后

def info(name,age,country='China') # name,age是普通参数,country是默认参数
    print('name:',name)
    print('age:',age)
    print('国家:',country)
info(age=21,name='kernel') # 使用关键参数,可以不按照顺序

No.6 元素和字典拆包

*args

def demo(*args):
    print(args) # ('kernel', 21, '山东')
demo("kernel",21,"山东")

**kargs

def demo(**kwargs):
    print(kwargs) # {'name': 'kernel', 'age': 21, 'address': '山东'}
demo(name="kernel",age=21,address="山东")

No.7 递归函数

特点:

函数内部调用自己

函数内部的代码是相同的,只是参数不同,处理结果不同

当参数满足一个条件时,函数不再执行

栗子
data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
def binary_search(dataset,find_num):
    if len(dataset) >1:
        mid = int(len(dataset)/2)
        if dataset[mid] == find_num:  #find it
            print("找到数字",dataset[mid])
        elif dataset[mid] > find_num :# 找的数在mid左面
            print("找的数在mid[%s]左面" % dataset[mid])
            return binary_search(dataset[0:mid], find_num)
        else:# 找的数在mid右面
            print("找的数在mid[%s]右面" % dataset[mid])
            return binary_search(dataset[mid+1:],find_num)
    else:
        if dataset[0] == find_num:  #find it
            print("找到数字啦",dataset[0])
        else:
            print("没的分了,要找的数字[%s]不在列表里" % find_num)
binary_search(data,66)

No.8 函数的可变参数和不可变参数

在函数中,针对参数使用赋值语句,会不会影响函数调用时的实参呢?

不会,只要针对参数使用赋值语句,无论是可变类型还是不可变类型,都会在函数修改参数的引用,不会影响到外部变量的引用

def demo(num, num_list):
    print("start")
    # 赋值语句
    num = 200
    num_list = [4,5,6]
    print("id=%d,num=%d"%(id(num),num))
    print("id=",id(num_list),"num_list=",num_list)
    print("end")

gl_num = 100 # id=1875081376,gl_num=100
gl_list = [1,2,3] # id= 2164478175240 gl_list [1, 2, 3]
print("id=%d,gl_num=%d"%(id(gl_num),gl_num)) # id=1875084576,num=200
print("id=",id(gl_list),"gl_list",gl_list) # id= 2164477982152 num_list= [4, 5, 6]
demo(gl_num, gl_list)
print("id=%d,gl_num=%d"%(id(gl_num),gl_num)) # id=1875081376,gl_num=100
print("id=",id(gl_list),"gl_list",gl_list) # id= 2164478175240 gl_list [1, 2, 3]

如果传递的参数是可变类型,在函数内部,使用方法修改了数据的内容,同样会影响到外部的数据

def demo(name_list):
    name_list.append('end')
    print(name_list)
name_list = ['kernel']
print("id=",id(name_list),"name_list",name_list) # id= 1980496082376 name_list ['kernel']
demo(name_list)
print("id=",id(name_list),"name_list",name_list) # id= 1980496082376 name_list ['kernel', 'end']
demo(name_list)
print("id=",id(name_list),"name_list",name_list) # id= 1980496082376 name_list ['kernel', 'end','end']
我们发现,外部变量的数据已经被改变了,但是它的引用一直没有改变
再看一个栗子
def demo(name_list=[]):
    name_list.append('end')
    print(name_list)
demo() # ['end']
demo() # ['end', 'end'] 
demo() # ['end', 'end', 'end']
demo() # ['end', 'end', 'end', 'end']
这不是我们想要的结果,那怎么办呢?
我们只需要将形参改成一个不可变类型就可以了
def demo(name_list=None):
    name_list = []
    name_list.append('end')
    print(name_list)
demo() # ['end']
demo() # ['end']
demo() # ['end']
demo() # ['end']

No.9 高阶函数

满足下列条件之一就可以称为高阶函数

  • 存在一个参数为函数
  • 函数的返回值中存在函数

map函数

map函数是Python内置的高阶函数,它接收一个函数和一个可迭代对象,并将函数作用在可迭代对象的每个元素上,返回一个map对象

def func(x):
    return x * x

r = map(func,range(10))
print(list(r)) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

reduce函数

reduce函数也是Python内置的高阶函数,同样它接收一个函数和一个可迭代对象,但是函数必须要接收两个参数,reduce对可迭代对象的每个对象调用函数,并返回最终结果

栗子1
from functools import reduce
def func(x,y):
    return x * y

r = reduce(func,range(1,10))
print(r)
调用过程func(func(func(func(func(func(func(func(1,2),3),4),5),6),7),8),9)
栗子2
from functools import reduce
def func(x,y):
    return x * y

r = reduce(func,range(1,10),10)
print(r)
调用过程func(func(func(func(func(func(func(func(func(1,10),2),3),4),5),6),7),8),9)

filter函数

filter函数也是Python内置的高阶函数,同样它接收一个函数和一个可迭代对象,函数的作用是对每个元素进行判断,返回True和False,filter根据判断结果自动过滤掉不符合条件的元素

def func(x):
    if x % 2 == 0:
        return x

r = filter(func,range(10))
print(list(r))

lambda函数

没有函数名

单条语句

语句的执行结果就是返回值

name_list = ['kernel','alex','qiyue','hobby','eric','aomikee']
r = sorted(name_list)
print(r)
r = sorted(name_list,key=lambda x:len(x))
print(r)

No.10 函数闭包

内部函数

def outer():
    print('outer is running。。。')
    def inner():
        print('inner is running。。。')
    inner()
outer()
outer is running。。。
inner is running。。。
内部函数inner存在于outer函数作用域内部,所以如果在outer外部区域调用inner函数就会报错

关于闭包

def outer():
    x = 10
    y = 10
    def inner():
        print(x+y)
    return inner

fun = outer()
fun() # 20
如果试图在一个内部函数里对外部函数的变量进行引用,这就是Python的闭包,由于闭包基于内部函数,所以闭包同样不能在外部进行调用

修改外部函数的变量

def outer():
    x = 10
    y = 10
    def inner():
        x = x + 1
        print(x+y)
    return inner

fun = outer()
fun() # UnboundLocalError: local variable 'x' referenced before assignment

因为闭包是基于内部函数的,所以说将会启动Python解释器的屏蔽机制,这时候Python解释器就认为x是内部函数的局部变量,我们此举正是试图对不存在的变量进行修改操作,所以报在定义之前引用错误,那么,怎么解决这个问题呢

Python2

如果外部函数作用域的变量是可变类型的,那么它就不会被Python解释器屏蔽掉
def outer():
    x = [10]
    y = 10
    def inner():
        x[0] = x[0] + 1
        print(x[0]+y)
    return inner

fun = outer()
fun() # 21

Python3

使用nonlocal关键字
def outer():
    x = [10]
    y = 10
    def inner():
        nonlocal x
        x = x + 1
        print(x+y)
    return inner

No.11 作用域

块级作用域

想想下面的程序会运行成功吗?为什么?

for i in range(10):
    pass

print(i) # 9
代码执行成功,在Java/C#等强类型语言中,执行上面的语言会提示i没有定义,而在Python中确是可以执行的,那是因为Python中没有块级作用域,代码内的变量,外部可以调用

局部作用域

def say_hello():
    name = 'kernel'
    print('hello ',name)

print(name) # NameError: name 'name' is not defined
运行报错,name变量只在函数中起作用,所以全局是无法调用的

作用域链

Python存在作用域链,首先从自己的作用域找,如果没有就去一级一级的往上找,如果没有找到就报错

name = "Alex"
def f1():
    name = "Eric"
    def f2():
        name = "Kernel"
        print(name)
    f2()

f1() # Kernel

栗子

name = "kernel"
def f1():
    print(name)

def f2():
    name = "eric"
    f1()

f2() # Kernel
为什么会输入Kernel而不是eric呢?
那是因为函数在未执行时,作用域链就已经形成了,所以f1会去全局变量中找name这个变量而不是f2
r = ([lambda :x for x in range(10)])

print(type(r))
for i in r:
    print(type(i))
    print(i())
返回的结果是一个列表类型,列表的每个元素是一个函数,所有的函数运行出来都是9,为什么呢?
那是因为函数在没有执行的时候,内部代码是不会执行的

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python全栈开发之函数

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python全栈开发之函数

No.1 函数介绍所谓函数,就是把具有独立功能的代码块组织为一个小模块,在需要的时候调用函数的使用有两个步骤:1、定义函数2、调用函数函数的作用,代码重用,提高开发效率No.2 定义和调用定义函数的格式如下:def 函数名(): 函数
2023-01-31

Python全栈开发之---mysql数

1、数据库的安装和连接 1 #数据库安装 2 pip install PyMySQL 3 4 #数据库操作 5 import pymysql 6 7 db = pymysql.connect("数据库ip","用户","密码","数据库
2023-01-30

Python全栈开发之---assert

一、python assert的作用:根据Python 官方文档解释(https://docs.python.org/3/reference/simple_stmts.html#assert), "Assert statements are
2023-01-30

Python全栈开发之Git

No.1 Git特点版本控制:可以解决多人同时开发的代码问题,也可以找回历史代码分布式:Git是一个分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上,首先会有一台计算机充当服务器,这台计算机7*24小时服务,其他计算机都是从这台
2023-01-31

python全栈开发之Python基础(

一、 基础知识python的运行方式有两种:第一种通过交互式的运行方式,通过 "开始"—>"所有程序" —> "python3.x" —>"IDLE" 运行。第二种是我们写好的Python文件双击运行。 Python的帮助系统 hel
2023-01-31

Python全栈开发之并发编程

No.1 线程什么是多任务就是操作系统可以同时运行多个任务,就是可以一边用浏览器上网,同时又可以听歌,还能再撩个×××姐,这就是多任务,操作系统会轮流把系统调度到每个核心上去执行并发和并行并发是指任务数多余cpu核数,通过操作系统的各种任务
2023-01-31

Python全栈开发之Django基础

No.1 MVC&MTVMVCM全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查操作V全拼为View,用于封装结果,生成页面展示的html内容C全拼为Controller,用于接收请求,处理业务逻辑,与Mode
2023-01-31

Python全栈开发之---装饰器

1、装饰器的形成过程 1 import time 2 3 def func1(): 4 print('in func1') 5 6 def timer(func): 7 def inner(): 8 st
2023-01-30

Python全栈开发之Django进阶

No.1 静态文件处理项目中CSS、JS、图片都属于静态文件,一般会将静态文件存到一个单独目录中,便于管理,在HTML页面调用时,需要指定静态文件的路径,Django提供了一种解析静态文件的机制,文件可以放在项目目录下,也可以放在应用目录下
2023-01-31

Python全栈开发之基础语法

No.1 Python语言介绍详情见百度百科。。。No.2 Python是一门怎么样的语言详情在百度百科。。。No.3 Python能做什么网络应用、桌面应用、系统运维、机器学习、科学计算。。。网络应用 Django/Flask/Torna
2023-01-31

Python全栈开发之文件操作

No.1 文件的概念文件的概念和作用计算机中的文件,就是存储在某种长期储存设备上的一段数据流 计算机中的文件,可以在需要的时候使用文件的存储方式文本文件可以使用文本编辑器查看本质上还是二进制文件二进制文件保留的内容不能直接查看,而是提供给其
2023-01-31

Python全栈开发之网络编程

No.1 TCP/IP早期的计算机网络,都是由厂商规定自己的通信协议,互不兼容,为了把全世界不同类型的计算机连接起来,就必须规定一套全球通用的协议,所以就出现了TCP/IPNo.2 Socket简介要解决怎么标识一个进制,在一台电脑上可以同
2023-01-31

Python全栈开发之面向对象

No.1 概念面向对象的特点?注重对象和指责,不同的对象承担各自的指责更加适合对复杂的需求变化,专门应对复杂项目开发,提供固定的套路面向对象强调的是谁来做,面向过程强调的如何做什么是类类是对一群具有相同特征或者行为的事物统称,是抽象的,不能
2023-01-31

Python全栈开发之异常处理

No.1 异常的概念程序在运行过程中,遇到一个错误,会停止程序的运行,并且提示一些错误信息,这就是异常程序停止执行并且提示错误信息这个动作,称为抛出异常No.2 捕获异常简单捕获异常格式捕获异常最简单的语法格式:try: 尝试执行的代
2023-01-31

Python全栈开发之常用模块

No.1 syssys模块是与Python解释器交互的一个接口sys.argv 命令行参数List,第一个元素是程序本身路径sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)sys.version
2023-01-31

python 全栈之路

目录 Python 全栈之路 一. Python 1. Python基础知识部分 2. Python -函数 3. Python - 模块
2023-01-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录