《我的世界》Python编程入门(9) 使用函数建造房子

2023-11-19

一、函数的基本概念

1.1 函数在数学中的概念

函数指一个量随着另一个量的变化而变化。
函数的数学形式:y=f(x)
f是一种定义好的关系,可以简称为函数,在函数f中,只要x值的确定,那么y的值一定是确定的。y的值随x值的变化而变化。

1.2 Python中的函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段
Python中函数可以分为内置函数自定义函数
前面课程用到的print()input()也是函数,只不过是内置函数,即系统已经事先定义好的函数。
在大多数情况下,我们需要根据自己的需要自定义函数。
自定义函数的基本语法格式

def 函数名(参数列表):
    函数体
    return 返回值

自定义函数由def关键字函数名参数列表函数体返回值五部分组成。

  • def关键字必备
  • 函数名必备,函数名除满足标识符的基本要求外,注意不要跟系统关键字、内置函数冲突(初学者最容易出现的问题)。
  • 参数列表中 ()不能省略。参数是可选的!Python函数参数形式较多,这也是函数学习中的难点!
  • 函数体可选,函数体即函数执行的功能代码。
  • return语句为可选项,return语句后面的表达式或值就是返回值,即函数被调用后返回的一个变量。如果没有return语句,返回值为None,即空对象。

注意!函数体和return至少存在一个,不能同时没有两者
思考:通过函数定义的格式学习,今后用到某些函数、方法的时候,应当注意哪些事项?

案例1:定义函数、调用函数

#定义函数
def hello():
    print("你好!")
    return 1
#调用函数
hello()

程序运行结果为:
你好!
案例分析

该案例可分为函数定义和函数调用两个部分。
函数定义部分
我们定义了一个函数,其中:
函数名为hello
参数列表为(),即没有参数
函数体为print(“你好!”)
返回值为1

调用函数部分
调用函数的基本格式为:函数名()

注意区分函数的返回值和函数的执行结果!

问题

在本案例中函数的执行结果是什么,返回值是什么?

函数的执行结果是函数调用后一定能得到的结果!
返回值在函数被调用后产生,但是我们只有接收使用时,才能感受到它的存在!

练习一:

试一试运行以下代码,分析下结果中哪些是运行hello函数的执行结果,哪些时函数的返回值。

def hello():
    print("你好!")
    return 1

print(hello())

1.3 编写函数的优势

  1. 函数的使用可以重用代码,提搞代码的重复利用率。即一次定义,多次调用。
  2. 函数能够封装内部实现,使用者不用关心函数内部实现,只需要知道这个函数怎么用即可。例如:我们买汽车,通常不是买一堆零件自己组装,而是买的厂家直接“封装”好的汽车。我们只管使用汽车,不用关心汽车是如何生产的。
  3. 函数可以有效组织代码,使程序模块化,便于程序的阅读、调用、修改和完善。

二、函数的参数

在前面的例子中,函数的参数列表为空,也就是没有参数,函数的执行结果是固定的,不能随着参数变化而变化。
下面我们就通过一系列例子来感受下函数参数的应用!

2.1 形参、实参

案例2:简单的带参数的函数
def cacl(a, b):
    result = a*10 + b
    return result

print(cacl(1,2))
print(cacl(2,1))

如果有多个参数,参数用 , 隔开。
注意形参(parameter)、实参(argument)的区别
定义函数时的参数 形参,调用函数时用的值 实参
在本案例中,a、b是形参,1、2是实参。
形参即形式参数,实参即实际的参数。

2.2 位置参数

函数参数常用的传递方式有位置参数和默认参数。
位置参数,也叫必传参数、顺序参数,在所有参数中是最重要的。也是在调用函数时必须明确提供的参数!位置参数必须按先后顺序,一一对应,参数个数不能多也不能少。
例如案例3,定义时有2个参数a、b,如果调用时我们用
calc(1),即只用1个参数,程序就会出错

2.3 默认参数

在函数定义时,可以给参数设定一个默认值,那么这个参数就是默认参数,不再是位置参数了。调用函数时,可以给默认参数设定一个值,如果不写默认参数,默认参数自动取默认值。
案例3:默认参数

def chengji(x, n=3):
    return x*n

res1 = chengji(2,n=4)
res2 = chengji(2)
res3 = chengji(2,5)
print(res1, res2, res3)

默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。

2.4 参数定义及调用顺序

函数参数定义的顺序规则:位置参数在前,默认参数在后
函数参数调用(即实参)顺序:位置参数按在前,按位置取值;默认参数位置可调整,指定参数名称时按参数名称取值,未指定名称时,按参数定义顺序取值

练习二:函数参数定义及调用顺序
def test1(a,b,c=1,d=2):
    print(a,b,c,d)

#test1函数按顺序输出a,b,c,d四个变量的值,运行以下函数调用语句,体会参数调用顺序。
test1(1,2)
test1(1,2,d=3,c=2)
test1(1,2,d=4)
test1(1,23)

三、变量的作用域

变量的作用域非常重要,用于了解程序中变量是否有效。
在函数内定义的变量叫做局部变量(local variable),只在函数内部有效。
在全局(可以简单的认为定义在函数外)定义的变量叫做全局变量(global variable),在整个程序中都有效。

案例:局部变量

def c():
    d =2
c()
print(d)
案例分析

我们在函数c中定义了变量d,d为局部变量,只能在函数内部使用,执行函数c后,打印变量d结果为

Traceback (most recent call last):
  File "c:/Users/Administrator/Desktop/111.py", line 13, in <module>
    print(d)
NameError: name 'd' is not defined

print(d)是在函数外调用d,变量d出了函数的作用域!

案例:全局变量

a=1
def c():
    d = 2
    print(a + d)
    
c()
案例分析

本案例先定义了全局变量a,然后在函数c中定义了局部变量d,在函数中计算a+d的值并打印输出,最后执行函数c。结果为
3,说明全局变量a在函数内也可以使用。

案例:全局变量进阶

运行这两个程序,对比下结果!

#程序1
a = 1

def b():
    a = 2

b()
print(a)


#程序2
a = 1

def b():
    global a
    a = 2

b()
print(a)
案例分析

在函数内部,如果局部变量与全局变量变量名一样,则优先调用局部变量。如果全局变量是不可变对象,在函数内部改变全局变量,需要在前面加上global关键字,在执行函数之后,全局变量值也会改变。

给变量命名时一定要想清楚:变量是否需要全局访问,如不需要,避免在函数等局部作用域中定义同名的变量。

练习三:计算阶乘

写一个函数,实现功能为传入一个大于1的整数n,求123*…*n的结果,并返回。(求阶乘)

def factorial(x):
    result = 1
    for i in range(1,x+1):
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
    return result

print(factorial(5))

四、综合案例:使用函数建造房子

要求设计一个函数实现自定义建造房子,可以设置建造房子的位置和大小!

案例分析

原案例根据玩家坐标确定建造位置,玩家坐标可以设置为其它任意坐标。原案例大小根据size变量确定,可以修改该变量改变房子大小。
因此,函数的参数可以设置4个,前3个为xyz坐标,最后一个设置为大小,默认为20。

代码实现

import mcpi.minecraft as minecraft
import mcpi.block as block
#先导入所需模块,然后连接游戏
mc = minecraft.Minecraft.create()
#size表示所建房屋的大小,改变size可以改变房子的大小
size = 20
#获取玩家所在坐标点
pos = mc.player.getTilePos()
x=pos.x
y=pos.y
z=pos.z

def create_house(x, y, z, size=20):
    '''
    x,y,z为建造房子的基准坐标点
    size为房屋大小
    '''
    #midx、midy为正面方向房子在x、y轴上的中间点,便于计算窗户和门的坐标
    #如果房子大小改变,窗户、门的位置也会随之变化
    midx = x + size/2
    midy = y + size/2

    #根据size建造一个实心立方体
    mc.setBlocks(x, y, z, x+size, y+size, z+size, block.COBBLESTONE.id)
    #将立方体的内部掏空
    mc.setBlocks(x+1, y, z+1, x+size-1, y+size-1, z+size-1, block.AIR.id)
    #实现门,midx代表了x轴坐标的中间位置
    mc.setBlocks(midx-1, y, z, midx+1, y+3, z, block.AIR.id)
    #填充玻璃窗户
    mc.setBlocks(x+3, y+size-3, z, midx-3, midy+3, z, block.GLASS.id)
    mc.setBlocks(midx+3, y+size-3, z, x+size-3, midy+3, z, block.GLASS.id)
    #使用木材方块建造一个屋顶
    mc.setBlocks(x, y+size, z, x+size, y+size, z+size, block.WOOD.id)
    #在房子内增加一个羊毛地毯
    mc.setBlocks(x+1, y-1, z+1, x+size-1, y-1, z+size-1, block.WOOL.id)
create_house(x,y,z)

小结

函数定义:注意函数定义的各个组成部分
函数的参数:
注意形参、实参的区别
注意各类参数定义与调用的顺序
变量作用域:注意变量定义的位置

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《我的世界》Python编程入门(9) 使用函数建造房子 的相关文章

  • Python requests_toolbelt MultipartEncoder 文件名

    使用 requests toolbelt 以多部分形式上传大文件 我构建了一个方法 可以成功上传文件 但是我无法访问发布的文件名 如何访问服务器上的文件名 client side file open Volumes Extra test m
  • Python数据框将列表列分解为多行[重复]

    这个问题在这里已经有答案了 我有一个像这样的数据框 desc id info a b c 2 type u v w 18 tail 三列 desc id info desc 是一个列表 我想要这个 des id info a 2 type
  • 如何在Python中每次运行脚本时增加变量?

    我有一个 Python 脚本 我想在每次运行时增加一个全局变量 这可能吗 使用外部文件很容易做到这一点 您可以创建一个函数来为您执行此操作 这样您就可以根据需要将多个文件用于多个变量 尽管在这种情况下您可能想要研究某种序列化并将所有内容存储
  • Pythonic方式逐行读取文件?

    以下两种方法中逐行读取文件的 Pythonic 方法是什么 with open file r as f for line in f print line or with open file r as f for line in f read
  • Keras AttributeError:“顺序”对象没有属性“predict_classes”

    我试图按照本指南找到模型性能指标 F1 分数 准确性 召回率 https machinelearningmastery com how to calculate precision recall f1 and more for deep l
  • 使用数据库数据模型生成 SQLAlchemy 模型、架构和 JSON 响应

    将 Flask 和 SQLAlchemy 用于 Python Web 应用程序 我的目标是创建一个系统 在其中我可以 从现有 PostgreSQL 数据库导入数据模型 并将它们映射到相应 SQLAlchemy 模型中的字段 使用这些 SQL
  • 如何从numpy数组中获取两个最小值

    我想从数组中取出两个最小值x 但是当我使用np where A B np where x x min 0 1 我收到此错误 ValueError 需要超过 1 个值才能解压 我该如何修复这个错误 我需要在数组中按升序排列数字吗 您可以使用n
  • 如何在Python中打印出字母表中的第n个字母?

    ASCII 数学似乎在 Python 中不起作用 一 5 不起作用 如果没有字母数组 如何快速打印出字母表中的第 n 个字母 我天真的解决方案是这样的 letters A B C D E F G H I J K L M N O P Q R
  • 抓取多个帐户,即多次登录

    我可以成功抓取单个帐户的数据 我想在一个网站上抓取多个帐户 这意味着多次登录 如何管理登录 注销 您可以在每个帐户会话中使用多个 cookiejar 并行抓取多个帐户 请参阅 cookiejar 请求元密钥http doc scrapy o
  • 使用多索引列对多列求和

    我有一个从数据透视表创建的数据框 看起来类似于 import pandas as pd d company1 False Negative April 2012 112 0 April 2013 370 0 April 2014 499 0
  • 当有效的 django 表单保存在数据库中时如何触发自定义 python 代码

    Django 新手 我创建了一个简单的表单如下this https www youtube com watch v 3XOS UpJirU教程 我的表单正确地将数据保存在我的 Postgres 连接的本地数据库中 我想知道 每当将有效表单保
  • Flask 无法识别两个 URL 参数

    我正在尝试将两个参数发送到使用 Flask 路由的 URL If I do curl i http 127 0 0 1 5000 api journeys count startStationName Hansard 20Mews 20Sh
  • PySide2/QML 填充 Gridview 模型/委托并为其设置动画

    我是 QML 的新手 正在寻求以下几点帮助 如何基于 TextField 输入 如 Regex 通过 PySide2 过滤 Gridview 模型中的 QAbstractListModel 数据 标题 如何在鼠标悬停时为 Gridview
  • Pytest 插件:覆盖 pytest_runtest_call 和朋友

    我正在为我的一个项目使用 pytest 开发一个测试套件 由于项目的性质 我需要创建一个 Pytest 插件来控制测试的运行方式 它们不是在本地运行 而是发送到不同的进程来运行 我知道关于xdist但我认为这并不能解决我的问题 我一直在通过
  • matplotlib 轴标签偏移量的因素和变化

    在 matplotlib 中的轴刻度标签上 有两种可能的偏移量 factors and shifts 在右下角 1e 8 是一个 因子 1 441249698e1 是一个 移位 这里有很多答案展示了如何操纵两个都 matplotlib 将轴
  • 当前异常上下文掩盖了先前的错误

    以下是我在 Doug Hellman 网站上名为 masking exceptions catch py 的文件中找到的示例 我暂时无法找到链接 throws 中引发的异常将被丢弃 而 cleanup 中引发的异常将被报告 道格在他的文章中
  • 如何用不同的颜色填充seaborn.distplot中的区域

    是否可以用颜色填充两条阈值线 line1 和 line2 之外的区域 并通过 distplot 绘制的 KDE 曲线限制 Y 轴 代表我的应用程序的 3 sigmas import pylab as pl import seaborn as
  • 在 matplotlib 中添加新的导航模式

    我正在编写一个 wx matplotlib 应用程序 并且在向 matplotlib 导航工具栏添加新工具时遇到相当大的困难 基本上我想添加选择工具 选取框 套索等 以切换受控子图的鼠标模式 到目前为止 我还没有找到任何功能可以让我轻松地做
  • 在 python 中将数组作为参数传递

    我是Python新手 现在我需要声明大小为 20 的数组并将该数组传递给函数 需要数组的函数如下 function args The args是一个输入function 谁能帮我 如何在 python 中传递数组 当你说 数组 时 我假设你
  • 无法比较类型“ndarray(dtype=int64)”和“str”

    Example of data that I want to replace 数据具有以下属性 购买 V 高 高 中 低 维持 V 高 高 中 低 门 2 3 4 5 更多 2 4人以上 lug boot 小 中 大 安全性低 中高 这就是

随机推荐

  • ARP与ARP代理的理解

    1 ARP 首先讲到ARP ARP是地址解析协议 它的作用是在以太网环境下 通过第3层的网络层IP地址来找寻2层数据链路层的MAC地址 得到一张ARP缓存表 转发数据的时候根据ARP缓存表来进行传输 下图详细说明数据传输时ARP是如何一步步
  • TVP新书上架

    新书速递 近期 在腾讯云 TVP 联合出书计划中 腾讯云 TVP 山金孝老师推出了新书 融合 产业数字化转型的十大关键技术 融合 产业数字化转型的十大关键技术 作者 山金孝 李琦 中译出版社 内容简介 数字经济已成为高质量发展的新引擎 数字
  • [Django基础06]模型和数据库交互

    2 数据库配置 MySQL 通常情况下 如果你只是做测试使用 可以使用Django内置的数据库SQLite就完全可以满足需要了 我们在本次教程中 通过使用MySQL这个数据库来完成后续的功能操作 我们首先要做的是 在配置文件中指定数据库的配
  • Densely Connected Convolutional Networks 密集连接卷积网络

    什么是DenseNet DenseNet是由清华大学的Zhuang Liu 康奈尔大学的Gao Huang和Kilian Q Weinberger 以及Facebook研究员Laurens van der Maaten在CVPR 2017所
  • 5.13 综合案例2.0-火焰检测系统(2.2版本接口有更新)

    综合案例2 0 火焰检测系统 简介 火焰传感器 准备 硬件连接图 代码流程 功能实现 1 物联网平台开发 2 设备端开发 调试 3 物联网应用开发 4 1新建 普通项目 4 2创建 Web应用 4 3页面设计 4 4关联产品 4 5关联数据
  • 蓝桥杯C/C++百校真题赛(3期)Day3(考勤刷卡、最大和)

    Day3 Q1 考勤刷卡 Q2 最大和 Q1 考勤刷卡 问题描述 小蓝负责一个公司的考勤系统 他每天都需要根据员工刷卡的情况来确定 每个员工是否到岗 当员工刷卡时 会在后台留下一条记录 包括刷卡的时间和员工编号 只 要在一天中员工刷过一次卡
  • 【反向工程】从科研文献表格,反向还原数据

    很多时候会遇到这样一个问题 有一些文章在chart中汇报了实验结果 但是并没有标注上具体的实验数值 如果逍遥获得具体数值 就得用尺子去量 这里推荐一个网站 能够帮助你估计一张chart中 每个数据点对应的横纵坐标 在某些情况下很有用处 至少
  • 数据仓库灵魂30问之数仓基础理念理解

    主题 主题是一个抽象概念 是在较高层次上将数据综合 归类并进行分析利用的抽象 每一个主题都对应一个宏观的分析领域 在实际上 每一个主题对应这个分析领域的所有的分析对象 比如销售主题对应所有和销售这个领域有关的数据 主题域 主题域通常是联系较
  • 效果奇特的HTML5动画,12个效果奇特的HTML5动画赏析

    本文将为大家分享12个效果奇特的HTML5动画 HTML5强大的动画特性可以让你的网页变得更加生动和富有活力 交互性也会进一步得到提高 一起来看看下面的这些HTML5动画案例 没个案例都提供源代码下载 1 HTML5 Canvas瀑布动画
  • KVM源代码分析1:基本工作原理

    http www oenhan com kvm src 1 13年的时候准备挖 KVM源代码分析 的坑 陆陆续续2年过去了 坑也没有填上 当时是因为对KVM了解的肤浅 真正的理解必然要深入到代码级别 所谓 摈弃皮毛 看到血肉 看到真相 当时
  • CH347读写SPI Flash

    前面耽搁了几天 今天终于把CH347 SPI接口调试好了 CH347动态库中SPI接口函数如下 typedef struct SPI CONFIG UCHAR iMode 0 3 SPI Mode0 1 2 3 UCHAR iClock 0
  • SD卡系列之---SD初始化(SPI)

    SD卡分为SDIO模式与SPI模式 SDIO模式使用SD总线协议 使用4根数据线进行数据传输 SPI使用1收1发2根数据线数据传输 理论上SDIO模式会比SPI模式速度快4倍 但SDIO模式还牵扯到CRC校验位的计算 所以 如果使用CPU有
  • 高防cdn和高防服务器的区别,有什么不一样

    CDN通俗的理解就是网站加速 可以解决跨运营商 跨地区 服务器负载能力过低 带宽过少等带来的网站打开速度慢等问题 一个网站的服务器性能比较差 负载能力有限 优势面临突发流量 招架不住 直接导致服务器奔溃 网站打不开 CDN 跟 高防服务器
  • 快速玩转 Llama2!阿里云机器学习 PAI 推出最佳实践

    前言 近期 Meta 宣布大语言模型 Llama2 开源 包含7B 13B 70B不同尺寸 分别对应70亿 130亿 700亿参数量 并在每个规格下都有专门适配对话场景的优化模型Llama 2 Chat Llama2 可免费用于研究场景和商
  • DesktopUI与ZeroTierOne的数据交互机制分析

    分析源码 梳理了一个调用关系图
  • 用python绘制RC低通滤波器bode图

    用python绘制RC低通滤波器bode图 Bode图 Bode图 国内有译作 伯德图 也有译作 波特图 是一种用于描述线性系统的频率响应的图形工具 频率响应是指系统对不同频率的输入信号的响应程度 通常用幅度和相位来表示 Bode图以对数坐
  • layui复选框按钮事件(智能去重刷新)

    1 写好复选框 lt input type checkbox value 0 name available title 智能去重 id available lay filter available gt 2 给复选框加事件 form on
  • RMSE数值在什么范围比较好呢

    RMSE Root Mean Squared Error 数值越小越好 通常来说 对于大多数应用来说 RMSE的值在0 1到1之间是可以接受的 当然 这取决于具体的应用和数据 如果数据本身具有很大的方差 那么RMSE的值就会更大
  • 如何制作静态和动态链接库-小白入门

    1 gcc编译过程 gcc为GNU编译套件 GNU Compiler Colletion 2 gcc编译命令 0 o 指定生成目标文件 00 O 设定优化级别 123越大越高 1 I 指定头文件目录 2 D 指定宏 避免修改源代码 3 g
  • 《我的世界》Python编程入门(9) 使用函数建造房子

    一 函数的基本概念 1 1 函数在数学中的概念 函数指一个量随着另一个量的变化而变化 函数的数学形式 y f x f是一种定义好的关系 可以简称为函数 在函数f中 只要x值的确定 那么y的值一定是确定的 y的值随x值的变化而变化 1 2 P