iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python学习——【第八弹】
  • 366
分享到

python学习——【第八弹】

python学习开发语言压栈函数 2023-09-26 09:09:18 366人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

前言 上篇文章 python学习——【第七弹】学习了python中的可变序列集合,自此Python中的序列的学习就完成啦,这篇文章开始学习python中的函数。 函数 在学习其他编程语言的时候我们就

前言

上篇文章 python学习——【第七弹】学习python中的可变序列集合,自此Python中的序列的学习就完成啦,这篇文章开始学习python中的函数

在这里插入图片描述

函数

在学习其他编程语言的时候我们就了解过函数函数就是执行特定任何以完成特定功能的一段代码

那么我们为什么要使用函数呢?

复用代码
隐藏实现细节
提高可维护性
提高可读性便于调试

函数的创建

python中函数的创建方式:

def 函数名 ([输入参数]):
函数体
[return xxx]

形参:形参出现在函数的定义处
实参:实际参数的值,位置出现在函数的调用处
在这里插入图片描述

函数的调用

在学习其他的语言时我们知道,函数只有在调用的时候才能执行,python中的函数也是一样的。调用函数的方式也很简单:

[返回值] = 函数名([参数])如果函数没有参数,则括号中可以留空
def pri():    print('helloworld')pri()#调用函数 

那么在调用函数时,对调用的参数有什么要求呢?

函数调用的参数传递

位置实参:根据形参对应的位置进行实参传递

def add(a,b):    num=a+b    return numresult=add(10,20)print(result)  #30

关键字实参:根据形参名称进行实参传递

def add(a,b):    num=a+b    return numresult=add(b=10,a=20)print(result) #30

需要注意的是,创建函数有多少个形参,那么调用时就需要传入多少个值,且顺序必须和创建函数时一致。即便该函数没有参数,函数名后的小括号也不能省略。

函数参数的定义

函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参

def fun1(a,b=10):    print(a,b)# 函数调用fun1(100) #100 10fun1(20,30) #20 30 与默认形参值不相符,传递实参值

个数可变的位置形参

定义函数时,可能无法事先确定传递的位置的实参的个数,可以使用可变的位置参数
2:使用 * 定义个数可变的位置形参
3:结果为元组类型
4:如果没有需传递的位置实参,但是使用了可变的位置参数,这时再调用该函数,会返回一个空元组 即args=()

def fun1(*args):    print(args,type(args))fun1(10)fun1(10,20)fun1(10,20,30)'''(10,) (10, 20) (10, 20, 30) '''def fun11(x,y,*args): #已知形参(x,y)要放在位置形参之前;否则会报 SyntaxError: invalid syntax 无效语法错误    print('x=',x)    print('y=',y)    print('args=',args)fun11(11,22,33,44,55)'''x= 11y= 22args= (33, 44, 55)'''

注意:使用个数可变的位置参数时,可变的位置参数只能是1个
在这里插入图片描述

个数可变的关键字形参

定义函数时,无法事先确定确定传递的关键字实参的个数时,使用可变的关键字形参

使用 ** 定义个数可变的关键字形参

结果是一个字典

如果没有需要传递的关键字实参,但是使用了可变的关键字参数,这时再调用该函数,会返回一个空字典 即args={}

def fun2(**args):    print(args,type(args))fun2(a=10)fun2(a=10,b=20,c=30)'''{'a': 10} {'a': 10, 'b': 20, 'c': 30} '''def fun22(x,y,**args):  #已知形参(x,y)要放在关键字形参之前;并且位置实参的个数要和位置形参的个数保持一致,否则会报:TypeError: fun22() takes ... positional arguments but ... were given  实参数与形参数不符    print('x=',x)    print('y=',y)    print('args=',args)fun22(11,22,c=10,d=0)'''{'a': 10}{'a': 10, 'b': 20, 'c': 30}'''

注意:使用个数可变的关键字形参时,可变的关键字形参只能是1个

def fun6(**args,**args):    pass# 程序报错 SyntaxError: invalid syntax  无效语法

定义函数的过程中,既有个数可变的关键字形参,也有个数可变的位置形参,要求个数可变的位置形参放在个数可变的关键字形参之前。

def fun(x, y, *args, **argss):    print("x=", x)    print("y=", y)    print("args=", args)    print("argss=", argss)fun(1, 2, 3, 4, e=5, f=6, g=7) '''x= 1y= 2args= (3, 4)argss= {'e': 5, 'f': 6, 'g': 7}'''# 可变位置参数和可变关键字参数需要传递的实参数不相匹配时,如果可变位置参数或可变关键字参数没有收到需要传递的实参的值的话,调用函数时分别返回空元组和空字典。def fun(x, y, *args, **argss):    print("x=", x)    print("y=", y)    print("args=", args)    print("argss=", argss)fun(3, 4) '''x= 3y= 4args= ()argss= {}'''

函数参数的传递

位置参数的传递

def funs(a,b,c):    print('a=',a)    print('b=',b)    print('c=',c)funs(10,20,30)lst=[11,22,33]funs(*lst)# 使用位置参数传递,在函数调用时,将列表中的每个元素都转换为位置参数传入'''a= 10b= 20c= 30a= 11b= 22c= 33'''

关键字参数的传递

# 关键字参数传递funs(a=111,b=222,c=333)dic={'a':444,'b':555,'c':666}funs(**dic)# 使用关键字参数传递,在函数调用时,将字典中的每个元素的键值对都转换为关键字参数传入'''a= 111b= 222c= 333a= 444b= 555c= 666'''

在 * 之后的参数,在函数调用时,只能采用关键字参数进行传递

def funcs(a,b,*,c,d):    print('a=',a)    print('b=',b)    print('c=',c)    print('d=',d)funcs(10,20,c=30,d=40)'''a= 10b= 20c= 30d= 40'''

在这里插入图片描述

函数传递时形参的位置问题

在这里插入图片描述

函数的参数总结
1 :将序列中的每个元素都转换为位置实参 使用*

2 :将字典中的每个键值对都转换为关键字实参 使用 **

3 : 关键字形参 使用*

4 :个数可变的位置形参 使用*

5 :个数可变的关键字形参 使用**

函数调用参数传递内存分析

def fun(num1,num2):    print('num1=',num1,id(num1)) #num1= 90 140471326216032    print('num2=',num2,id(num2)) #num2= [11, 22, 33, 44] 140471317443120    num1=111    num2.append(999)    print('num1=',num1,id(num1)) #num1= 111 140471326216704    print('num2=',num2,id(num2)) #num2= [11, 22, 33, 44, 999] 140471317443120print('---------调用函数之前---------')add1=90add2=[11,22,33,44]print(add1,id(add1))  #90 140471326216032print(add2,id(add2))  #[11, 22, 33, 44] 140471317443120print('-------------调用函数----------')fun(add1,add2)'''num1= 90 140471326216032num2= [11, 22, 33, 44] 140471317443120num1= 111 140471326216704num2= [11, 22, 33, 44, 999] 140471317443120'''print('-----------调用函数后----------')print(add1,id(add1)) #90 140471326216032print(add2,id(add2))  #[11, 22, 33, 44, 999] 140471317443120

在这里插入图片描述

可以发现:在函数调用过程中,若要进行参数传递:

如果是可变对象(如列表、集合、字典),在函数体内对其进行修改会影响到函数体外的这个可变对象的值(因为可变对象在内存中是可变的,可以被修改),其id地址不会发生改变

如果是不可变对象(如数值、字符串、元组),在函数体内对其进行修改不会影响到函数体外这个不可变对象的值(因为不可变对象在内存中是固定的,无法被修改),其id地址不会发生改变

函数返回值

当函数不需要返回值时,函数体内可以省略return;并且​函数执行完毕后,不需要给调用处提供数据

def pri():    print('helloworld')pri()

当函数只有一个返回值时,返回值类型就是原类型

def fun2():    return 'hello'res=fun2()print(res,type(res)) #hello 

当函数有多个返回值时,返回值类型是一个元组

def fun(num):    odd=[]    even=[]    for i in num:        if i%2==0:            odd.append(i)        else:            even.append(i)    return odd,evenlist1=[11,22,32,23,45,6,0]print(fun(list1),type(fun(list1)))# ([22, 32, 6, 0], [11, 23, 45]) 

变量的作用域

程序代码能访问该变量的区域 称作变量的作用域

根据变量的有效范围可分为:

局部变量

在函数体内定义并使用的变量,只在函数内部有效,局部变量使用global声明 , 这个变量就会成为全局变量

def func1(a,b):    c=a+b   #c 就成为局部变量  因为c是在函数体内进行定义的变量   a,b是函数的形参  作用范围也是函数内部  相当于局部变量    return cprint(func1(1,2))#3
# 使用global 声明局部变量,a b为全局变量,在函数体内可以直接被调用;c在函数体内定义,属于局部变量,因此需要用global声明才能在函数体外被调用a=1b=2def func3():    global c    c=a-b    return cprint(func3())  #-1

全局变量

函数体外定义的变量 ,可作用于函数体内

# 全局变量  a=1,b=2为定义在函数体外的变量,属于全局变量,在函数体内与函数体外均可调用a=1b=2def func2():    c=a+b    return cprint(func2())  #3

递归函数

什么是递归函数如果在一个函数的函数体内调用了该函数本身, 这个函数就称作递归函数

递归的组成部分递归调用与递归终止条件

递归的调用过程每递归调用一次函数 ,都会在栈内存分配一个栈帧(每次调用函数时,在内存中都会单独开辟一个空间,配合函数运行,这个空间叫做栈帧空间。)每执行完一次函数, 都会释放相应的空间

递归的思想

递归是一去一回的过程,调用函数时,会开辟栈帧空间,函数执行结束之后,会释放栈帧空间,递归实际上就是不停地开辟和释放栈帧空间的过程,每次开辟栈帧空间,都是独立的一份,其中的资源不共享。

递归其实利用的时是压栈的思想,我们看一下下面这个例子:
在这里插入图片描述

压栈思想:
在这里插入图片描述

递归的优缺点

优点:

递归函数使代码看起来干净整洁。使用递归可以将复杂的任务分解为更简单的子问题。与使用嵌套嵌套相比,使用递归更容易生成序列。

缺点:

有些情况,递归背后的逻辑很难遵循。递归调用很昂贵(效率低),因为它们占用大量内存和时间。递归函数调试较为复杂。

递归函数的应用

利用递归函数计算阶乘

def func1(n):    if n == 1:        return 1    else:        return n*func1(n-1)print(func1(6)) #720

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

利用递归函数计算​ ​斐波那契数列​​

斐波那契数列:1、1、2、3、5、8、13、21、34。。。

F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)

计算第n位的斐波那契数是多少

def func2(n):    if n == 1:        return 1    elif n == 2:        return 1    else:        res=func2(n-1)+func2(n-2)        return resprint(func2(6)) #8

打印出整个斐波那契数列

for i in range(1,7):    print(func2(i),end=' ')print('\n')#1 1 2 3 5 8 

键盘录入一个整数,然后根据这个正整数打印出斐波那契数列以及其数列和

num=int(input('请输入一个正整数:'))def func3(num):    if num==1:        return 1    elif num==2:        return 1    else:        result=func3(num-1)+func3(num-2)        return resultnums=[]sums=0for n in range(1,num+1):    # print(func3(n),end=' ')    nums.append(func3(n))    sums+=func3(n)print('产生的斐波那契数列是:',nums)print('\n第',num,'位的斐波那契数为:',func3(num))print('\n斐波那契数列之和为:',sums)

在这里插入图片描述

每篇一语

努力的人运气都不会太差!

如有不足,感谢指正!

来源地址:https://blog.csdn.net/weixin_64122448/article/details/130107336

--结束END--

本文标题: python学习——【第八弹】

本文链接: https://www.lsjlt.com/news/418284.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • python学习——【第八弹】
    前言 上篇文章 python学习——【第七弹】学习了python中的可变序列集合,自此python中的序列的学习就完成啦,这篇文章开始学习python中的函数。 函数 在学习其他编程语言的时候我们就...
    99+
    2023-09-26
    python 学习 开发语言 压栈 函数
  • python 学习 第八篇 jquery
    简介:jQuery是一个javascript库。极大滴简化了javascript编程。包含内容:HTML 元素选取HTML 元素操作CSS 操作HTML 事件函数JavaScript 特效和动画HTML DOM 遍历和修改AJAX1:下载 ...
    99+
    2023-01-31
    第八篇 python jquery
  • Python学习第二弹
    昨天补充:       编码: Unicode ; utf-8 ; GBK       关系:                    关键字:1. continue 终止当前循环,进行下一次循环                2. b...
    99+
    2023-01-31
    Python
  • Python第八周 学习笔记(1)
    基本概念个体继承自父母,继承了父母的一部分特征,但也可以有自己的个性 子类继承了父类,就直接拥有了父类的属性和方法,也可以定义自己的属性、方法,甚至对父类的属性、方法进行重写 Python继承实现 class Cat(Anima...
    99+
    2023-01-31
    学习笔记 Python
  • 我的python学习--第七、八天
    Flask的HTTP方法HTTP(与web应用会话的协议)有许多不同的URL方法。默认情况下,路由只回应GET请求,但是通过route()装饰器传递methods参数可以改变这个行为。HTTP方法告知服务器,客户端想对请求的页面 做些什么。...
    99+
    2023-01-31
    python
  • mysql学习13:第八章:锁
      1.   锁 InnoDB支持行锁,有时升级为表锁。 MyISAM只支持表锁。 表锁:开小小,加锁快,不会出现死锁;锁粒度大,锁冲突概率高,并发度低。 ...
    99+
    2024-04-02
  • 学习笔记-小甲鱼Python3学习第八讲
    按照100分制,90分以上成绩为A,80到90为B,60到80为C,60以下为D,写一个程序,当用户输入分数,自动转换为ABCD的形式打印。使用if 条件:...elif 条件:...else...循环fenshu0 = input('请输...
    99+
    2023-01-31
    甲鱼 学习笔记 第八讲
  • 学习笔记-小甲鱼Python3学习第十八
    形参和实参>>>def MyFirstFunction(name):            '函数定义过程中的name是形参'            #因为它只是一个形式,表示占据一个参数位置            pri...
    99+
    2023-01-31
    甲鱼 学习笔记
  • 学习python的第十八天(面向对象编程
    一.面向对象编程 ​ 面向过程编程,核心是编程二字,过程指的是解决问题的步骤,即先干什么、后干什么、再干什么、然后干什么…… 与工厂的工艺流程差不多,前后都有影响 优点:复杂的问题流程化,进而简单化,调理清晰. 缺点:拓展性不行 二.对...
    99+
    2023-01-31
    面向对象 python
  • 学习python的第十八天(模块导入及使
    一.模块导入及使用 1.模块导入的两种方式 我们拿time模块并使用其中的time功能进行举例 a)第一种 import time print(time.time) import首次导入模块发生了3件事: 打开模块文件 执行模块对应的...
    99+
    2023-01-31
    模块 python
  • Python学习之旅(三十八)
    二、MySQL MySQL是Web世界中使用最广泛的数据库服务器。SQLite的特点是轻量级、可嵌入,但不能承受高并发访问,适合桌面和移动应用。而MySQL是为服务器端设计的数据库,能承受高并发访问,同时占用的内存也远远大于SQLite...
    99+
    2023-01-30
    之旅 Python 三十八
  • Python 学习第二章
    本章内容 数据类型 数据运算 表达式 if ...else 语句 表达式 for 循环 表达式 while 循环 一、数据类型    在内存中存储的数据可以有多种类型。    在 Python 有五个标准的数据类型 Numbers ...
    99+
    2023-01-30
    第二章 Python
  • python 学习第四天
    目录 基本运算符 算术运算符 比较运算符 赋值运算符 逻辑运算符 身份运算符 pyth...
    99+
    2023-01-31
    第四天 python
  • 学习python第二天
    一、python的版本选择与安装后的操作 python 2 vs 3 1。 默认支持中文 2. 不兼容2.x 3. 核心语法调整,更易学 4. 新特性默认只在3.x上有 系统位数 32bit =内存的最大寻址空间是2**32, ...
    99+
    2023-01-31
    第二天 python
  • Python学习笔记整理(八)Pytho
      程序由模块构成 模块包含语句 语句包含表达式 表达式建立并处理对象 一、Python语句 语句 角色 列子 赋值 创建引用 a,b,c='good','bad...
    99+
    2023-01-31
    学习笔记 Python Pytho
  • python学习第二天
    目录 操作系统 操作系统干了什么 为什么要有操作系统 操作系统有什么用 应用程序的启动和操作系统的启动 ...
    99+
    2023-01-31
    第二天 python
  • python学习 第五篇 flask
    #!/usr/bin/env python #coding:utf-8 from flask import Flask,request,render_template,redirect #request 里面包含一次网络请求所有的内容,所有...
    99+
    2023-01-31
    第五篇 python flask
  • python 学习第二周总复习
    目录 数据类型内置方法 数字类型内置方法 整型 浮点型 字符串类型内置方法 列表...
    99+
    2023-01-31
    总复习 python
  • python学习第二天 -----201
    第二周-第02章节-Python3.5-模块初识 #!/usr/bin/env python #-*- coding:utf-8 _*- """ @author:chenjisong @file: sys.py @time: 2019/...
    99+
    2023-01-31
    第二天 python
  • Python之路【第八篇】:Python
    一、模块和包 模块(module)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码会越来越长,越来越不容易维护。 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较...
    99+
    2023-01-31
    之路 第八篇 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作