大家好,今天教你们 python 中的 while 循环。首先打开 python 编辑器, 在 python 中两个循环,一个是否,一个是 while 输入 while 空格输入条件,比如我这边填 two, 还要打冒号,然后 print 里面的文字你随便搞, 慢慢看它的循环过程是这样的, python 首先会进入 while 循环,然后再进入 print, 然后再次循环,不信你打印多个 print, 如果你说的还不信的话,马上你就信了。看到了它的循环过程了吧,接下来我将会给你带来个狠的,如果将 to 改为 false 会怎么样? 正确答案一个都打印不出来。最后再给你介绍一下 while 循环顶级使用,将 a 定义为零, 这里填小于号,它会从零一直打印到一百, 然后把条件改为 true, 它就能循环打印下去了。运行起来试试,可以看到循环打印了,你学会了吗?
粉丝47获赞309

my circle 中 in 和 exist 的区别?在 my circle 中, in 和 exist 是用于只查询中的条件运算符。它们有以下区别,应运算符用于检查一个值是否存在于只查询返回的结果集中。 他将比较左侧的表达式与只查询的结果并返回匹配的行,如果只查询返回的结果集中包含任何与左侧表达式匹配的值, 则条件为真。 exist 的运算服用于检查只查询是否返回了至少一行结果。他只关心只查询是否返回了结果,而不关心具体的返回值是什么。如果只查询返回了至少一行结果,则条件为真。

哈喽哈喽,宝宝们,欢迎来到刘木老师的拍森小课堂上一个视频我们学习了 print 的 进阶用法,那这个视频刘木带着大家一起来学习。变量还是一样,咱先介绍一下原理,再进行代码实操。变量的功能就是存储,提前用变量保存 字母串就可以方便后续的频繁使用。例如生活中我们都需要打电话,可手机号码这个字母串非常长,十一位的数字不仅很难记住,而且一个一个输入呢,也非常麻烦。那我们这个时候就想呢,能不能提前把它保存起来呢?手机中有个叫做通 讯录的东西,保存了所有的手机号,为了区分每一个手机号,我们还会给他打上一个备注的人名,通过人名我们就能够拨打手机号了。人名其实就是我们给手机号贴的一个标签,通过这个标签就可以获得他对应的值。程序中变量也是一样的意义, 用来存储或者代值某一个值的。为了区分每一个变量,我们也会给变量取个名字,通过语法变量名等号变量值,我们就可以创建一个变量了,这叫做负值操作,把等号后面的值放在等号前面的名字里面进行保存。需要注意的是,变量的名字 需要遵循一定的命名规则,目前我们先暂时使用英文字母表示,详细的规则我们会在下个视频单独讲解。复制之后,我们就可以通过变量的名字获取这个值了,反 复使用,不需要你每次都重新敲一遍。另外, python 是 从上到下执行的,你必须在前面先对变量进 行赋值,然后才能够使用这个变量,否则就会出现报错,好比你现在还没有把对象的号码存在通讯录里,你 就完了吧。你要这个电话号码,那必然是没有结果的程序,不是算命,他没有办法帮咱掐指算哦。当然变量的值也可以修改,假如你对象换了一个号码,或者你换了一个对象,那 my love 这个手机号也会跟着改变,很简单, 还是用复制操作,变量名不变等号,后面写上新的值就好了。变量之所以叫做变量,就是因为它可以改变,那现在打印出来的就是新的手机号了。好的,接下来就是我们的实践时间了,在这里呢,我已经 提前创建好了一个文件,相信这个操作大家都不陌生了,我们就直接来看代码吧。假如说我现在在这个地方需要执行一个打招呼的语句,例如 prince。 晚安, 亲爱的,我们现在右击运行之后,可以在控制台看到有这么一个字母串。假如说我想要给多个人打招呼的话,我们可以使用上节课学习到的加号拼 接,我们只需要在后面加上不同人的名字就行了,比如说小帅,好的,我们再来上一个小高,还可以在这个地方来上一个小腹。右击 运行之后,我们就可以看到三条不一样的打招呼语句,在这三条语句当中,晚安亲爱的,这个字母串的出现频率是非常高的,我刚才是通过复制的形式写下来的,那假如说我们要一个一个去手敲的话呢,就会非常的繁 琐,此时我们可以使用刚才学习到的变量来进行一个保存,我们先给他取上一个名字叫做 greet, 表示打招呼的意思,后面跟上等号,再把晚安 亲爱的把这个字母串写在后面就可以了。此时我们可以来检查一下鼠标,放到下一行拍叉这个工具,它就自动提醒我们了,可以写上 print greet 来检查这个变量当中保存的数据,我们可以直接按 tab 键进行一个自动补全,右击运行,发现 greet 这个变量当中保存的确实是晚安亲爱的这个字母串。那现在我们想要执行打招呼语句的话呢,就非常简单了,直接 prints 通过 greet 在 后面呢使用加号来拼上小帅小高的名字即可,再来上一个小腹,右击运行, 发现它们的功能和前面呢都是一样的,这种写法可以让我们的代码更加的便捷。好的,那现在呢,我们再来看一下 print 的 第二个功能,我们可以修改 print 当中保存的数据。假如现在我想要高级一点打印一个英文的打招呼,那我们可以在这个地方写上一个 greet, 把里面的内容我们重新写上一个英文的就可以了,比如说我在这个地方写上一个 good night 第二好,那就表示了 good night 第二,晚安亲爱的,我们此时再重新执行一下这三条语句,我们直接把它复制下来,右击运行, 一看到现在的结果就变成了 goodnight 第二小帅,第二小高以及第二小富。好的操作完毕,那么宝宝们我们来总结一下今天的笔记吧。首先第一点,变量是保存值的功能,创建方式是变量名等号变量值。第二一点,我们可以通过变量的名字 使用里面保存的值。第三点,变量的值是可以进行修改的,那么在下个视频我们会一起学习 python 当中更加强信的变量名命名规则,我们下期见。

你知道 python 中的这个运算符吗?它有什么作用?这是一个在 python 三点八版本以上新增的运算符。由于它长得像倒过来的海象,被形象地称作海象运算符,官方名称为赋值表达式,语法结构为 variable, 冒号等于 expression。 variable 是 要赋值的变量名, expression 是 在计算的表达式。海象运算符的核心特性是它能在表达式内部完成变量的定义与赋值,这也是它和普通赋值语句最核心的区别。普通赋值语句仅能独立执行,无法嵌入到表达式中,而海象运算符支持边赋值边使用。 我们来看个案例,代码基于一个列表生成字典,字典需包含列表的总和、长度和均值。我们可以看到代码中计算了两次列表的总和与长度,而借助海象计算符,代码只需要计算一次,能有效避免重复计算,尤 其在条件判断、循环迭代、推导式等需要先计算。在使用的场景中合理运用海象计算符能让 python 代码更精炼、更简洁。

五分钟教会你拍唱基础,请注意,本片是学修教学,正派请绕道!首先我们先来看看这样一段代码的运行结果,可以看到拍唱在输出台上面打印出来了你好两个字,那么这段代码就是拍唱中最基础的打印代码。大家注意这个括号和引号,这两个符号都是我们在 英文输入法的状态下写的英文标点符号,如果你用的中文标点符号 python, 它就会给你报错,无法正常运行代码。如果你想打印两个不同的字母串,比如想要输出台显示你好和 hello 两行字母的话,我们回车换行之后再输入 print hello, 然后再运行 就可以看到输出台会显示你好和 hello 两行代码。恭喜你,你已经学会了如何使用 print。 学习完 print 输出,那么我们接着讲输入 input, input 就是 输入内容,把我们需要的内容输入到括号和引号里面,但是我们输入的内容需要有个载体,这个载体就是变量,变量就是将数据进行存储的载体, 也可以改变。举个例子,我们写一个 a 等于一,那么就定义了一个变量, a 里面存储了一个数值,一将这个变量用 print 打印出来,你就会得到一个数值。一学会了变量之后,你就可以用它来做很多事情。比如我写这样一个程序,输入一个变量, a 等于 input 你 的体重,我们写下 print 你 的体重加 a 加金。我 我们运行一下,随便输入一个体重,点击回车,你就会看到体重是多少斤。那么接下来我们来一个基础的计算操作,假如你的体重是超过标准体重一百三十斤的,那么我们怎么用程序来计算超过了多少呢?音符输入你的体重,后面输出减去国家标准体重的数值, 这里我们需要在变量 a 前面加上整数符来进行拼接。点击运行,这里我们输入一百八十,那么程序就会用一百八十减去一百三十,得到的数值就是五十,这是比较简单的计算。接下来我们看看条件判断,假设体重超过一百八十斤是 属于超重,那么我们怎么判断超重呢?这里可以用 f 加条件即可,条件后面写上冒号,下一行写上运行的代码,要注意第二行的代码要缩进四个空格,那么我们来运行一下这个代码。如果你输入的是一个大于一百八十的数字,那么运行的结果就会显示超重。如果是小于一百八十的数字, 这不会显示。如果你想小于一百八十的也显示一个结果的话,我们在代码加上 else 不 满足条件输出正常。注意这里我们不需要进行缩进,我们运行看看现 现在我们输入一个小于一百八十的数字,它也会给我们显示结果了。用 i f l 是 这个语法,你就可以判断很多东西。这里给大家一个课外作业,假如你一个月五万,每个月开销七千,多久才能买上一套一百五十万的房子呢?大家可以按照视频中的教程自己来尝试一下。接下来我们讲循环, 循环的意思就是让一段代码来实现,我们来解析一下这段代码或是定义循环。 range 是 定义范围,零到一百是次数, 字母 a 用来记录现在是第几次循环,下面我们写需要运行的代码,注意需要运行的代码要有四个空格的缩进才能正常运行,我们来看一下效果,那么我们就成功输出一百次循环了。我们接着下来讲列表,变量, a 等于中括号,这个就是列表了,中括号里面可以存放多个数据,比如我们存放一二三,教大家 case, 用逗号隔开,每个列表里的数值都有序号,从零开始零一二,以此类推。如果我们想要拿取列表里的数据,可以直接输入系列号即可,比如你想打印第二个,我们直接输入 print 加括号,中括号里面输入二 进行就会得到拍散,那么我们想要得到第一个元素就输入零,得到的就是一百二十三,想要第几个就可以输入第几个。那现在我们来用列表做一个上课随机点名的代码吧。首先创建一个变量中括号,里面写上同学们的名字,那么我们怎么随机点名呢?我们先输入代码 import random, 导入随机库,然后换行输入 print a, random random 零四,这里的 random 点 random 表示随机选举, a 就是你的变量,也就是同学们的名字,括号里面写的数值是表示随机的范围,我们每次运行的时候得到的名字都是不一样的。那么到这里恭喜你学会了本视频的所有内容,如果说还有什么没听懂或者想要学习的,欢迎这里学习交流哦!

nan 作为 python 中常用的内置常量,你真的了解它吗? nan 本质是一个特殊的常量,它表示空值、无值或无意义的状态。通过 type 函数可以看到,它的专属数据类型为 nan type, 这是一种独立的类型,且 nan 是 nan type 类型中唯一的实力,意味着内存中始终只会存在一个 nan 对 象。接下来通过一个代码案例来直观验证一下。 由于 a 和 b 都被赋值为 n, 根据特性,因此无论是用于值比较的双等号,还是用于身份比较的意思,输出的结果均为 true。 不 过,在实际开发中,判断一个变量是否为 n 时,推荐优先使用意思执行效率更高,也是拍算官方更推荐的写法。 需要特别注意的是, n 不 等于任何有具体含义的值, n 就是 n, 它既不等于零,也不等于空字符串更不等于 false。 但是当 n 被转换为不尔值时,结果会是 false。 此外,那无法参与数学运算,也不能直接与字母串进行拼接,强行操作会报错。掌握难的核心特性,能帮助我们在 python 开发中更精准地处理空值场景,避免因对难的认知偏差引发不必要的 bug。

你知道字典吗?不是查字义的新华字典,而是 python 中常用的一种数据存储结构。 python 它是一种可变容器模型,用花括号定义字典由键值对组成,中间使用冒号分隔,不同键值对之间用逗号分隔。 需要注意的是,字典的键必须是唯一的,且只能是不可变类型,而值则没有限制,可以是任意数据类型。创建好字典后,我们可以通过键快速访问对应的值。实际代码中有两种常用方式,一是用方括号直接传入键,二是使用 get 方法。 因为字典是可变的,所以我们能通过键赋值来添加或修改元素。若想删除元素,也有两种实用的方法, 用的力关键字能直接删除指定键值对。用 pop 方法,在删除指定键值对的同时,还会返回该键对应的值。字典的便利也很灵活,通过调整循环的可迭代对象,就能实现单独便利键,单独便利值便利完整的键值对,这就是 python 中的字典。

你有好好了解过 python 中那些基础函数吗?它们都是 python 函数的核心组建,无需额外导入,可以直接使用。掌握这些函数可是学好 python 的 重要一步,今天就来快速带大家过一遍那些常用的内置函数。一、数据类型与转换这些函数是数据处理的起点开部函数,用于查看变量的数据类型,返回结果直观清晰。 int float str 核心类型转换工具用于类型转换,可以根据需求灵活切换数据类型。 list tuple 构建数据结构的核心函数,用于创建空容器,还能实现容器间的转换。从左到右分别为列表、圆组、集合字典,是构建复杂数据结构的基础。二、复制串处理 learn, 快 速获取复制串长度。 split 按指定分割符分割,复制串简单高效。 join 则是相反,用指定字母将复制串列表连接起来。 upper lower, 一 键实现复制串的大小写转换。 trip, 用于去除字母串首尾的指定字母,默认为空格。这些函数是日常开发中常用的操作,功能强大,非常好用。三、数学运算 abs 计算数值的绝对值。 round, 四舍五入注意,函数遵循的是银行家舍入法,和我们日常说的四舍五入略有不同。 power 球迷运算等价于双星号球迷运算符。 max, 找出给定参数的最小值和最大值。三、盘数对可迭代对象中的元素求和,这些都是处理数值数据的基础工具。如果需要进行更复杂的数学运算,可以导入 max 模块,获取三角函数、对数、常量等更多功能。掌握这些内置函数,能让你跳出重复造轮子的困境,用更 python 的 方式编写代码。

哈喽哈喽,宝宝们,欢迎来到刘木老师的拍森小课堂上一个视频我们已经学会了 print 的 基础用法,那这个视频刘木会带大家一起学习。 print 的 四个进阶玩法还是一样,咱先介绍一下原理,再进行代码实操。进阶方法一,字母串拼接 符串我们在上个视频讲过,就是用引号包裹住的文本内容,我们可以把多个字母串拼接成一个长的字母串,例如生活中我们会把多个符号组合在一起做圆文字表情包, 那 python 当中同样可以。进阶玩法二,字母串的引号使用字母串用单引号或双引号都可以,但如果文字内容本身要使用引号,我们就需要和包裹字母串的引号进行区 分。因为 python 非常懒惰,引号遵循的是就近原则。例如以下这个代码前面有一个引号叫做开始引号,那么 python 就 会接着往后走去找 结束引号,把它们凑成一对。但是因为它非常懒,刚好前面这两个又都是双引号,它就会直接把前面两个识别成一对。同理,后面的两个双引号也凑成了一对,而中间的内容没有引号包裹,这就容易 产生报错。我们解决方法有两种方式,一,可以使用不同的引号进行区分。在以下代码中,因为只有最开头和结尾的引号是一样的,那么 python 就 只能把这两个组成一 对,中间的内容则会被引号完全包裹起来,只要字母串里面的引号和外面的不一样就行。同理, 我们也可以把里面的引号换成中文引号,因为除了最外面的引号,中间的都属于文本内容,我们可以随意书写,中文英文没有要求,但是切记最外面的引号一定要用英文的,否则拍省识别不了。方式二,我们可以在字母串里面的引号前方加上一个反 斜杠,反斜杠呢,在我们 enter 键的上方,这个反斜杠叫做转译符,只要字母串里面有反斜杠,那么 python 就 会把这个反斜杠以及后面的字母放在一起识别,产生特殊的意思。 而反斜杠加引号就表明这是一个普通的标点符号,是属于我们文本内容的一部分,那就可以正常打印出来了。进阶玩法三,换行同样会使用到反斜杠,注意,我们的代码当中是不能够随意换行的,像这个样子就会报错,因为代码他需要读一行,执 行一行,读到第一行的结尾,看你没有结束引号和括号就以为你忘了,于是直接报错,根本不会往下进行。 那如果我们就想要分两行打印怎么办呢?其实也有方法,反斜杠后面加上一个小写字母 n 就 表示换行了,写在反斜杠 n 后面的数据就会在第二行展示。拼接玩法四, 三引号跨行字母串如果我们想要打印多行文字,按照前面的方法来换行就会非常头疼,要么我们每一句后面都得加上反斜杠 n 表示换行的效果,要么呢,我们就得写多个 print 语句,因为每个 print 都会默认 一起一行。那么现在我们来介绍一个更方便的操作,叫做三引号,其实呢就是三对单引号或者双引号,它会保留我们文本内容当中换行的格 是,这对于打印多行内容来讲非常的方便。然后是我们的实践时间还是一样的,在项目文件夹当中,我们来创建一个空白的拍摄文件,我们呢给它取名叫做零二打印进阶, 那么现在我们就可以在这个地方书写代码了,比如我们先来看第一个操作,关于字母串的拼接,先写上一个 print, 我们在这里写下第一个字母串,我这个地方呢,因为之前有写过,所以拍叉他会自动的在这里产生提示啊,但是我们不用管他,我重新写一个,你好,我叫好的,这是第一个,再用加号进行拼接,后面呢写上第二个字母串 留木,右击运行,我们会发现原本分成两个的字母串现在放在一起进行打印了,你好,我叫留木,那么我们再来尝试一下,在这个地方呢,我们写上一个大写字 t 进行拼接,接上我们的一个省略号,再拼上一个大写字母 t 运行,那这样的一个表情包就诞生了。好的,我们现在看一下进阶操作二,关于字母串当中引号的使用,比如我在这个地方想要给大家说一句话,宝子们加油, 你可以的,那么加油,你可以的。这是呢,我想要对大家说的话,我就可以把它用引号包裹起来,在这里我可以使用中文的双引号和我们外面英文的双引号进行 区分,当然我也可以使用中文的单引号和英文的引号进行区分,以及我还可以在这个地方使用英文的单引号和外面的双引号进行区分,这样拍摄都能够正常识别,那假如说我想要在引号里面使用英文的双引号,怎么 答案呢?会发现它出现了红色的报错,那么我们只需要在引号前面加上一个反斜杠,后面也是一样的,加上一个反斜杠,此时代码就正常了,我们再来运行,这四行都能够正常的进行打印。 好的,我们再来看第三个进阶操作,关于我们的换行符,我把这个代码呢先往上挪一点,我们在这里写上一个字母串,比如第一行, 再写上第二行,我们运行会发现第一行,第二行这六个字,它是会在同一行打印的,因为我是直接放在了一个字母串里面,此时我只需要在这两个文字中间加上一个反斜杠,小写 a, 我 们再来运行,那么他们就会在两行 进行打印了。同样的,我们再来尝试一下啊,比如我们写上一个亲爱的借信如物,好的,这中间我们只需要给他加上一个反斜杠 a 再来运行, 此时呢他们就会在两行进行打印呢。那么中间我在这个地方是加了一个空格的,这个空格呢,只是为了让他的格式看起来更加的美观而已,不会影响我们代码的其他功能。但是你们一定要注意, 千万不能够在代码的前面加空格哦。 python 当中,目前来说我们的代码必须顶格,写前面的空格是具有特殊含义的,如果说你乱加的话,那么它就会报错。关于这个空格的特殊含义,我们会在后面的课程当中学习到,先把这里取 消掉,恢复成正常的样子。接着来看我们的第四个操作,三引号的使用,三引号的书写非常简单,我们只需要把引号写三遍就行了,第一遍,第二遍, 第三遍。三引号敲完之后,它会自动的加上三个结束的引号,光标也会默认直接摆在三引号的正中间,那我们直接在这个地方进行打造就行, 这中间你存在的任何格式他都会原封不动的保留下来。比如我是在同一行打印的,那结果就是在同一行,如果我这里换了一行,那么结果就会出现在两行,如果我中间换了多行,那么他同样的中间也会存在多个空的行, 这是关于我们三引号的使用,如果说你用的是三个单引号,那也是一样的 print, 你 只需要把这个单引号给它敲三遍就行了,那这中间我们同样的可以输入文本内容,如果说你直接写,那就正常打印,如果存在换行的话呢,它也会进行一个换行显示。那么现在 让我在这里复制一个多行文本,我们来看一下它的效果。好的,我从这个地方复制比较长的一段文字过来,然后把它粘贴到这个中间,可以发现我这里呢是有四行的文字比较长,我们可以在这个地方拖动拍叉下方的滚动条来进行一个来回的展示。 当然呢我们也可以在这里啊,我们就干脆直接把它分成多行来进行一个打印。现在我们重新运行,会发现打印出来的内容跟我们书写的格式是一样的,也进行了换行。好的,那这是我们的所有操作了。有些宝哥可能会感觉到困惑,我们一个打印 什么要把它弄得这么花里胡哨呢?其中不排除部分程序员用来装的操作,但是它确实也方便了我们的代码书写。下个视频学了变量之后,我们会更加直观的感受到其中的一个重要作用,那么我们下个视频见。

列表作为最常用的数据结构之一, python 也为此提供了丰富的内置方法。今天就来讲讲其中常用的五种方法。第一个 app, 该方法用于在列表末尾添加一个任意类型元素,不改变原列表的内存地址,能直接修改列表。注意, app 的 方法只接受一个参数,如果想添加多个元素,则需要使用其他方法。 第二个 extend, 该方法用于将另一个可迭代对象的所有元素添加到原列表末尾,可以理解为合并。相较于 app 的 方法, extend 会将可迭代对象中每个元素分别添加至原列表。第三个 pop, 该方法用于移除列表中指定的元素并返回该元素。若不指定缩影,则默认删除。最后一个元素。如果缩影超出列表范围,就会产生报错。第四个 remove, 该方法会根据元素值删除列表中第一个匹配的元素。如果想删除所有的匹配元素,需要使用循环进行操作。第五个 index, 该方法用于查找并返回第一个匹配元素的锁影。 其中 start 和 nnd 为可选参数,用于指定搜索范围。如果想要找到所有匹配元素的锁影,需要结合循环和 start 参数来实现。这五种方法覆盖了列表的增、删、改、查等核心操作,熟练掌握它们就能帮你解决日常开发中大多数的列表处理需求。

上次课我们一起学习了 python 自带的开发环境 ide 的 使用方法,我们了解到 ide 有 两种工作模式,交互模式和文件模式。 那么这次课我们一起来学习一下 python 的 基础知识。 首先我们先复习一下 python 的 输入语句和输出语句, print 的 语句就是将括号里的内容在屏幕上显示出来,我们看几个实力,第一个呢, print 一 就是将数值一输出, 这个呢是将字母 a 输出,这个是将一和二的和这个表达式的值输出,如果有多项输出的话,中间呢可以用逗号隔开。下面我们看一下输入语句。 import 输入语句的功能呢是程序在运行过程当中,如果需要用户输入数据的时候,我们可以使用 input 语句。下面我们通过一个具体的案例来看一下如何使用 input 语句。 我们在 idle 的 文件模式下写一个代码,这个代码的功能呢是知道正方形的边长来计算正方形的周长, 我们将正方形边长的值放到 a 当中,我们用 l 来代表正方形的周长,所以 l 应该就等于边长乘以四,然后输出 有多个部分输出的话中间用逗号隔开。 代码写好了以后,要点击文件菜单里面的保存, 将这个文件保存到我们的桌面,给这个文件取一个文件名,计算正方形的周长,然后通过文件菜单里面的打开命令,我们可以打开电脑上存在的 py 文件, 然后再去点击运行菜单里边的运行命令,就可以运行刚才打开的文件。这个程序的功能啊,是计算边长为三的正方形的周长, 程序中边长 a 的 值是程序员设定好的,值为三,所以呢,这个程序只能够计算边长为三的正方形的周长,那如果我们想要计算任意边长正方形的周长,那么这个程序该如何修改呢? 我们是需要将这个边长的值啊,从长量三变成一个变量,而且这个值由用户在运行程序时输入。 ok, 我 们来修改一下代码,需要将边长的值从长量三把它改成一个变量,而且这个值呢是由用户来输入,所以我们需要使用 input 函数,在括号里边,我们可以通过字母串来改出提示性的字母, 那这一行代码在执行的时候就会提示用户输入正方形编程的值,然后复制给变量 a, 然后再计算出 l 的 值。代码编辑好了以后,我们点击文件菜单里面的保存, 其实这个保存呢,有快捷键,就是 control 加 s, 这样可以提高我们编程的效率。然后去点击 运行菜单里面的这个运行命令,运行命令呢,也可以按键盘上的 f 键,这也是运行的快捷键。我们看一下运行的结果,果然程序在运行过程当中要求我们来输入正方形变成了值,我们输入一个三,然后按回车, 哎,这个地方大家看一下说这个正方形的周长是三三三三出问题了,是不是?哎,很奇怪啊,我们再变形一次, 四四四四四,这不是我们想要的结果,对吧?那为什么呢?因为啊, import 它接收的这个值呢是字母串 而不是数值型,所以这个地方收集到的这个数据啊,是一个函数型数据,函数型数据参加这个数值运算的时候,他只是简单的把这个函数型数据重复四次,所以你输入的三,他这个变长的值就是四个三,输入的四,这个变长的值呢,就是四个四,很明显不符合我们的要求。 i e t 函数就是将你这个输入的值转变成整数来参与运算,如果这个变长的值是小数的话,那么就把它改成这个 float 浮点数,浮点型就是小数,好,我们修改一下,然后点击 ctrl s 保存代码,然后点击 f 五运行代码,输入正方形,变长的值是三按回车,它就是十二点零。好,我们再测试一个数据, 比如说它的变长的值是五 按回车,那么正反方向走上去就是二十点零,为什么后面多了一个点零呢?因为这个地方呢,它用的是一个 float 类型, float 类型呢是浮点数,就是带小数的,那如果是整数的话,那么就刚才说过,就把它改成 i n t 整数,我们按 ctrl s, 然后 按 f 五运行一下,如果输入五显示的就是二十,这就是输入语句 import。 使用方法, 长量和变量。在刚才这个程序当中,我们知道计算正方形周长的公式,周长等于四倍的边长,在这个公式当中,边长 a 是 可以变化的量,我们称之为变量 数字。四在程序运行过程当中是保持不变的量,我们称之为常量。计算机在处理数据时,首先要将数据调入到内存当中,然后才能进行各种操作。 变量是为了存放掉入的数据,在内存中开辟的一个存储单元,然后用一个标签指向这个存储单元,这个标签就是变量名。存储空间中存放的数据就称为变量的值,比如说 a 等于三, 意思就是将三这个数值存放到内存当中的这个空间,然后标签 a 指向这个空间, a 就 称为变量名,三就称为变量的值。那么这个变量 c 呢? 同样一个存储单元里边存放的值也是三,他用另外一个标签 c 来指向这个存储单元,所以啊, a 和 c 指向的是同一个地方,它们的值也是相同的,都是三。 而变量 b 它存放的值呢,是四。用标签 b 来指向这个存储单元,所以变量 b 的 值是等于四。 那么这个标签的命名规则啊,就是变量名的命名规则有下面三条,以后大家在写程序的时候一定要注意变量名,要写合法的变量名,如果你写的这个变量名不合法,程序是会报错的。 第一条规则是变量名是由字母、数字、下划线组成,并且呢是以字母或者下划线开头,不能以数字开头,所以这个 a 三 name 下划线,一下划线 name 包括单纯的这个下划线,它都是合法的变量名,而这个三 a 呢,是不合法的变量名。 第二条规则是区分大小写,大写的 a 和小写的 a, 它代表的是不同的变量。第三个就是变量名啊,不能使用 python 自己的关键字, 每一种高级语言都有自己定义过的关键字,比如我们 python 语言里面的一个 print, 包括刚才我们学的这个 import, 包括 if, else 等等,这些不能作为变量名。 下面我们来通过这个 i、 d、 l、 e 来简单的验证一下,比如说 我将三这个值赋给变量 a, 我 将三这个值复制复制给变量 c, 我 们通过 print 的 语句来验证一下 a 和 c 是 否相等 啊,输出的值是处,这说明变量 a 和变量 c 的 值是一样的,包括我用这个 id 查看一下变量 a, 我 用 id 查看一下变量 c, 这 id 的 功能呢,就是显示变量在内存当中的一个地址,大家看一下,这两个地址的值是一样的。这个变量 a 和变量 c 啊,其实是指向同一个存储空间,这个存储空间的编号是一样的。 piecing 常用的数据类型,在刚才计算正方形周长的这个程序当中,我们了解到 piecing 是 有不同的数据类型, 常见的数据类型呢,有下面这几种,整形就是整数。复变型就是小数字母型,是放在引号当中的数据,这个引号可以是单引号、双引号、三引号、 逻辑型数据。逻辑型数据的值呢,有处和 false 两个,比如说一大于二,这个表达式的值呢,它的一个值就是逻辑型数据 false。 同时啊,我们可以通过 int 函数、 float 函数和 str 函数进行数据类型的转换。下面我们通过 idele 给大家来演示一下不同数据类型之间有什么特征,以及转换函数是如何使用的。 一,它是一个整型数据,一点二是一个负点型数据,比如说一加一点二,它的值也是一个负点型数据。 那么函数型数据是放在引号里面的,这是函数型数据。而逻辑型数据,比如说一大于二,这个表达的值呢是 false, 这是一个逻辑型数据的值,可以通过 int 将函数型数据一、二、三转化为数值型数据。 可以使用 f、 a、 l、 t 将 字母型数据转化为浮体型数值,也可以通过 str 将数值型数据转化为字母。这就是 python 的 常用的数据类型 运算符和表达式。 python 为了进行数据运算,提供了大量的运算符,数值运算符,关系运算符, 还有一种叫逻辑运算符。以后我们再学数值运算符呢,有加减乘除乘方整除取于关系运算符,有大于小于、大于等于、小于等于不等于等于。 大家注意一下这些运算符的书写方法,下面我们通过 idle 来演示一下这些运算符的使用方法和使用格式。加 减乘 除二除一,二点零乘方二的三、四方 正除五,正除二就是五除以二。商的整数部分是二,取余就是五 除以二的余数是多少。这些呢就是数值运算符。下面看一下关系运算符, 关系运算符的值呢是处或者 false, 二大于一是处二小于一。 false, 二大于等于一,处二小于等于一。 false, 二不等于一,应该是处二等于一是 false。 这就是关系运算符的使用方法。 赋值语句,我们在计算正方形周长的这个程序里边,计算公式呢是边长乘以四, 是正方形的周长。那么怎么样把这个边长乘以四的这个值传递给这个周长 l 的 呢?是通过赋值号,赋值号就是我们数学里边这个等于符号,赋值号就可以实现把赋值号右边的这个值传递给赋值号左边的变量。 好,下面我们就来看一下这个赋值语句的使用方法,第一个 将数值一复制给变量 a, 第二个可以将变量 a 的 值复制给变量 b。 第三个是将变量 a 的 值加一,然后复制给变量 c。 这个使用格式大家注意一下,赋值号的左边是两个变量,赋值号的右边呢,是两个值,大家注意下对应关系,它的作用呢是将数值一复制给 a, 数值二复制给 b。 同样的道理,如果是三个变量的话,那么要注意一下对应关系, 同样可以将两个变量的值同时复制给左边的两个变量。这条复制语句的作用是将变量 a 的 值加一,然后复制给变量 a, 它的效果就是让变量 a 的 值增一。和这条语句相同的效果呢?有下面这个书写格式, a 加等于一,这个赋值语句的作用是等同于 a 等于 a 加一,但是呢,它的效率要比上面这条语句的效率要高。注意一下它的一个书写格式, a 乘等于二,就相当于 a 等于 a 乘二。 通过上面这些赋值语句的使用格式,我们注意到赋值号的左侧必须是变量,可以是一个变量,也可以是多个变量,它不能是表达式。赋值号的右侧可以是常量、数值性常量,也可以是字母性常量,可以是变量, 也可以是表达式。下面我们通过 ide 来演示一下赋值语句的使用, 给变量 a 复制一个一,我们输出 a 的 值就是一,我们可以把 a 的 值复制给 b, 那 么我输出 b, b 的 值肯定也是 a, 如果我让 a 的 值加一,然后复制给了 c, 所以 c 的 值就变成了二, 同时我们可以给两个变量同时复制,将二和三复制给 a 和 b, 那 么 a 就 等于二, b 就 应该等于三。 c 和 d, 那 它的值等于 a 和 b, 所以 c 的 值应该是等于二, d 的 值应该是等于三,那么 a 等于 a 加一,就是让 a 的 值增一。 a 刚才等于二嘛,现在增一就变成了三。 a 加等于一,那么 a 的 值应该等于几了, a 的 值就应该等于四了。刚才 a 的 值等于三嘛。 所以 a 加等于一的作用就等于 a 等于 a 加一, a 乘等于二, 那么 a 的 值应该等于几啦?等于八。这就是赋值语句的使用方法。

那么什么是 python 中的可变位置参数呢?一个视频教大家弄清楚。首先我们看这样的一个需求啊,比方说我这边定了一个函数啊,叫做自我描述啊,那我们就叫做自我介绍吧, 好,然后呢,在这里呢,我们就直接写上一个 name 和一个 hobby, 好, 那么一个是我们的名字,一个是我们的爱好啊, 好,来我们这边直接 print 一下啊,名字来,直接接入这个 name 啊,爱好,我们去接入这个 hobby 啊, 好,行,来,我们来调用一下啊,这个叫张三,爱好是这个篮球啊,好,行,那这样写完全没问题啊,然后呢,我们来运行一下 好,代码,没问题,对不对?那么未来如果有这样的一个需求啊,我有多个不同的爱好,对吧?那我能不能在这里呢,再写上一个号比一啊,再再写上一个号比二,代表我的多个不同的爱好,对不对? 好,那这边就必须填这个,一,要填这个什么呀?二,然后这边要传多个值啊,如果说你不传多个值,它会报一个错啊,叫做你遗失了一个必填的参数,对吧?后边啊,所以呢,这边你要去填上一个,比如说填上一个 rap 啊, 对吧?那这个应该是没问题的啊,非常的简单啊,非常的简单。好,我们来运行一下啊,答案也是没毛病, 对吧?但是如果未来还有什么 hobby 三, hobby 四啊,一直往后面去写,那就显得太复杂了,对不对?那这个时候我们有一个想法,我能不能把这个爱好用一个列表来表示呢?比如说叫 hobby 啊, hobby 啊,好,那么这个地方呢,我们就直接去输入这个 hobby 啊,也就是这边呢,我们不再用这种形式去传啊,用另外一种啊,叫做列表或者圆组的形式,对吧? 好,再来一个也没关系,对吧?好,那这个代码写完之后呢,我们来运行一下啊, 好,大家看结果没有任何问题啊,那么除了以这种列表或者圆组形式传呢,其还有另外一个写法啊,它和这个写法的其实作用差不多,但是在某些场景下,它语法更简洁啊,兼容性更高。 好,那具体这一方面我就不去谈啊,我只把这个方式给大家介绍一下啊,那这个方式就叫做可变位置参数啊,也就是说这个 hobbies 啊,就只要出现在这个 name 后边的从第二位开始的这个参数啊,无论你填多少个,我都被同一个参数来接受啊,就同都被这个 hobbies 来接受啊,也就是这边呢,你看 我把它撤掉啊,就不用这种列表的形式,这里不要啊,这里不要。那么在这里我传了几个参数呢?我还传了三个参数,对不对?那么这三个参数呢,我都想被这个 hobbies 去接受啊,我就只需要在前面写上一个星号, 好,它就是一个可变的位置参数啊,就只要出现在 name 就是 第一个参数之后的所有的值都会被这个 hobbies 接受啊,那么未来到底是不是这种就展现的形式,是不是我们想要的这种呢?会不会把所有的爱好写到这个 hobbies 里面呢?来,咱们看一下啊, 来,大家看是完全没问题的,对吧?所以呢,这个叫做可变位置参数,也就意味着我们只需要在第一位之后的这个参数接上一个新号,那么未来一第一参数之后的二三四五 六七八九十,无论你有多少个啊,都会被这个 hobbies 结束啊。好吧,那么这个,这个就叫做可变位置参数啊。好,那我们这个分享到这里结束啊。

今天分享一下 python 中的装饰器。装饰器是一个可调用的对象,其参数是被装饰的函数。装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。 已知代码是,一个装饰器的视力是依靠 b 包的形式实现的。所谓 b 包,就是嵌套在外部函数里的内部函数。如适理中的 timer inner, 可以 简单地理解为 b 包等于嵌套的内部函数加外部函数的变量环境。 b 包的三个必要构成条件,一、函数嵌套存在外层函数和嵌套在其内部的内层函数。二、变量引用 内层函数必须主动引用外层函数的局部变量参数。三、返回函数对象外层函数的返回值是内层函数本身 视力。实现了一个记录主函数运行时间的 timer 装饰器。通过 b 包函数 timer inner 实现了装饰器的功能,首先获取当前的时间,然后执行被装饰的函数并获取返回结果,之后计算被装饰的函数的运行时间, 最后返回被装饰函数的执行结果。装饰器 timer 通过返回 b 包函数完成装饰器,装饰器通过艾特操作符对被装饰函数进行修饰。这实际是一个语法堂,与以下的函数调用形式完全等效。 视力中实现的 timer 装饰器有个重要的缺点,遮盖了被装饰函数的 name 和 dog 属性。这里看到所返回的函数的 name 属性不是 name, 并且 dog 的 属性也不是 name 函数的文本字符串,这与设计的期待不符。对此可以使用 funktools direct 装饰器把相关的属性从被装饰函数复制到 timer inner 中。 从之前的例中可以看到, timer 装饰器并没有把相关的属性从 main 函数复制到 timer inner 中,而新的 timer v 二装饰器把相关的属性从 main 函数复制到了 timer inner。

欢迎来到 kuda tile python 内存模型讲解教程。在现代 gpu 编程中,理解内存模型是实现高效并行计算的关键。 q tile 提供了一个强大而灵活的内存模型,让开发者能够精确控制县城间的数据同步。 本教程将深入讲解 q tile 的 两大核心概念, memory order 内存顺序和 memory scope 内存范围。通过本课程,你将掌握如何使用这些机制来构建安全高效的运行程序。让我们开始这段精彩的学习之旅。现在让我们了解 q tile 内存模型的核心概念。 首先, qtyl 采用了一个允许冲排序的内存模型,这意味着为了提高性能,编仪器和硬件可以对操作进行冲排序。如果我们不使用显示同步,县城之间的内存访问就没有保证的顺序。 为了解决这个问题, qtyl 提供了两个核心机制。第一个是 memory order, 也就是内存顺序,它定义了原子操作的内存顺序语义。 memory order 包含四种模式, relax 只保证原则性,不保证顺序。 acquire 用于读操作,确保能看到之前的写入。 release 用于写操作,确保写入。对后续读曲。可见, aqure 用于读改写操作,结合了 acquire 和 release 的 特性。第二个核心机制是 memory scope, 也就是内存范围,它定义了参与内存顺序的现成范围。 memory scope 有 三个级别, block 范围用于同一 block 内的现成同步,这是最快的同步方式。 device 范围用于同一 gpu 上所有现成的同步 可以跨 block。 c s 范围用于整个系统的同步,包括多个 gpu 和 cpu。 理解这两个机制是掌握酷 tile 内存模型的关键,为什么我们需要内存模型呢?让我们通过一个经典的问题场景来理解。 假设我们有两个县城在写作,县城 a 是 生产者,他要做两件事,步骤一,写入数据, data 树组的第零个元素设置为四十二。步骤二,设置就绪标志 ready flag 树组的第零个元素设置为一,县城 b 是 消费者,他也要做两件事。 步骤三,检查就绪标志。如果 ready flag 的 第零个元素等于一,步骤四就读取数据,把 data 第零个元素复制给 result。 看起来很简单,对吧?但是这里有严重的问题,由于变易器和硬件的指令重排序优化,县城 a 可能先执行步骤二,再执行步骤一,这就导致县城 b 在 步骤四可能读到旧的未始化的 data 零值,即使他已经在步骤三看到了就绪标志为一, 最终结果就是程序出现不确定行为,数据不一致。这就是典型的数据竞争问题。这就是为什么我们需要内存模型来显示的控制内存访问的顺序。现在让我们来看解决方案,使用内存顺序同步。 在生产者县城 a 中,我们依然先写入数据 data 零等于四十二。但是在设置就绪标志时,我们使用 atomic store 原子存储函数,并指定 order 参数为 release。 这个 release 语义非常关键,它确保了之前的所有写入操作,也就是 data 零等于四十二,在标志写入时一定已经完成。在消费者县城 b 中,我们使用 atomic load 原子加载函数来读取就绪标志,并指定 order 参数为 acquire。 这个 acquire 语义保证如果获取到 flag 等于一,那么一定能看到生产者 release 之前的所有写入。现在我们建立了一个同步关系, release 确保之前的所有写入在标志写入时完成。 quire 确保能看到 release 之前的所有写入。这样当消费者读到 flag, flag 等于一时,就一定能正确读取到 data。 零等于四十二问题完美解决。这就是 acquire 和 release 内存顺序的强大之处。现在让我们深入了解 memory order 的 第一种 relaxed, 也就是松弛续。 relaxed 有 三个核心特性,第一,它保证原子性操作不会被打断。第二,它没有顺序,保证不能防止重排序。第三,它不能用于县城间同步。那 relax 适合在什么场景使用呢?它适合简单的计数器和独立的原子操作。让我们看一个代码实力,这是一个简单的计数器,实现 每个县城使用 atomic add 原子加法来增加计数器的值。注意,这里的 order 参数设置为 memory ordered。 relaxed 这个操作只关心原子性,也就是确保多个县城同时增加计数器时不会出现数据错误。但是它不关心序,不需要与其他内存操作同步。执行顺序的可知化是这样的,假设有两个县城可能的执行顺序是 data 等于一, 然后 counter 加加,然后 data 等于二,然后 counter 加加。但这个顺序是不确定的,可能会被重排。重要的是 counter 的 原则性得到了保证,记住, relax 只保证原则性,不提供同步能力。接下来是 memory order 的 第二种 acquire。 acquire 获取序用于读操作。 acquire 有 三个核心语义,第一,它专门用于读操作,也就是 load 操作。第二,后续的读写操作不能重排到该操作之前。 第三,也是最重要的,当读到由 release 写入的值时, release 之前的所有写入都变得可见。让我们通过时间线来理解,在 acquire 操作作之前,其他操作可以重排,但是 acquire 就 像一个同步点,后续的所有操作都不能重排到它之前,这就保证了内存访问的顺序性。 来看代码视例,这是一个消费者读取的场景,我们使用 atomic load 来读标志,并指定 order 参数为 memory order 啊。 acquire 这个 acquire 语义确保如果获取到 flag 等于一,那么生产者在 release 之前的所有写入都是可见的,这就建立了现成间的同步关系。 acquire 通常与 release release 配对使用,一个用于读,一个用于写,共同构建同步机制。现在来看, memory order 的 第三种 release 释放序用于写操作 release 同样有三个核心语义,第一,它专门用于写操作,也就是 store 操作。第二,之前的读写操作不能重排到该操作之后。 第三,也是最关键的,当 acquire 读到该值时, release 之前的所有写入对读取现成。可见。通过时间线来理解, release 在 release 操作之前的所有操作都不能重排到它之后。这就像一个战篮,确保了所有之前的写入都已完成, 而 release 之后的操作可以重排。来看代码示意,这是一个生产者写入的场景,我们使用 atomic store 来写入标志值,并指定 order 参数为 memory order。 release 这个 release 寓意确保当消费者通过 acquire 读到 flag 等于一时, 生产者在 release 之前的所有写入都是可见的。 release 与 acquire 配对使用,形成了一个完整的同步机制。 release 发布数据, acquire 获取数据。接下来是 memory order 的 第四种,也是最后一种。 xqrow 获取释放序,用于读改写操作。 escape 的 核心特点是结合了 acquire 和 release 的 语义,它专门用于读改写操作,比如 atomic add, 原子加法, atomic exchange, 原子交换等。具体来说, escape 有 两个层面的语义,第一,读操作具有 acquire 语义,能看到之前的写入。第二,写操作具有 release 语义,确保写入对后续读曲可见。 从时间线来看, sql 提供双向限制,操作之前的所有指令不能重排到之后,操作之后的所有指令不能重排到之前。这是最严格的内存顺序保证之一。来看代码是例,这是一个原子交换操作,用于实现锁机制。 我们使用 atomic exchange 尝试获取锁,并指定 order 参数为 memory ordered a c q l。 这个操作同时具有 acquire 和 release 语义。 acquire 确保能看到之前持有锁的现成的修改。 release 确保当前现成的修改对下一个获取锁的现成。可见, a q, r l 是 实现复杂同步源语如锁信号量的关键。现在让我们通过对比表格来总结 memory order 的 四种模式。 首先看 relaxed 松弛序,它保证原子性,但没有同步能力,也不能防止冲排序。适用于 load 和 store 操作,主要用于简单计数器场景。 acquire 获取序,它保证原子性,具有同步能力,能防止后续操作冲排到之前, 专门用于 load 读操作,典型场景是读取同步标志 release 释放序同样保证原子性和同步。能力能防止之前的操作重排到之后,专门用于 store 写操作,典型场景是设置同步标志 acq real 获取释放序,它保证原子性和同步能力,提供双向限制,既防止后续操作前移,也防止之前操作后移。 用于 rmw 读改写操作,如原子交换和原子加法。从上到下,同步能力越来越强,性能开销也相应增加。选择合适的内存顺序是在正确性和性能之间找到平衡。记住 relax 最快,但不同步。 acquire 和 release 配对使用实现同步。 a square 最强,但开销最大。现在让我们了解 memory scope 内存范围的第一种 block 快范围,用于同一 block 内的同步。 block 范围有三个核心特性,第一,顺序保证只适用于同一 block 内的县城, 同一 block 内的县城可以看到内存操作。第二,这是最快的同步范围,性能开销最小。第三,它不能跨 block 同步,不同 block 之间无法通过 block 范围建立同步关系。 block 范围的使用场景主要有两个, block 内的共享内存同步以及同一 block 县城间的协助。 让我们看 gpu 的 结构格式化。 block 零是同步范围,其中的 thread 零和 thread one 可以 通过 block 范围进行同步,而 block one 是 独立的,它的线程无法与 block 零的线程同步。代码示意了 block 范围的使用。 我们使用 atomic store 写入共享缓冲区,指定 order 为 release, scope 为 memory scope block, 这样这个写入操作只对同一 block 内的县城可见。记住 block 范围是最快的,但只能在 block 内使用。如果需要跨 block 同步,就需要使用 device 或 cis 范围。现在来看, memory scope 的 第二种 device 设备范围用于同一 gpu 上所有县城的同步。 device 范围有三个核心特性,第一,顺序保证适用于同一 gpu 上的所有线程,包括所有 block 中的线程。第二,性能开销中等,比 block 慢,但比 sis 快。 第三,可以跨 block 同步,这是它与 block 范围的主要区别。 device 范围的使用场景主要是多 block 协助以及全据数据同步。 从可视化来看,整个 gpu 都是同步范围。 block 零 block v block her block 三。所有这些 block 都可以通过 device 范围进行同步。代码示意展示了跨 block 同步的场景。我们使用 atomic add 原子加法操作全局计数器,指定 order 为 acq, rail scope 为 memory scope device, 这样所有 block 中的县城都可以安全地访问这个全局计数器。 device 范围是实现跨 block 写作的关键,适合需要全局同步,但不涉及多 gpu 的 场景。现在来看, memory scope 的 第三种,也是最后一种 system 范围,用于整个系统所有县城的同步。 cs 范围有四个核心特性,第一,顺序保证,适用于整个系统的所有线路。第二,包括多个 gpu 和 cpu。 第三,这是最慢的同步范围,性能开销最大。第四,提供最强的一致性保证。 cs 范围的使用场景主要是多 gpu 协助以及 gpu 与 cpu 之间的同步。 从格式化来看,整个系统都是同步范围, gpu 零 gpu 一 以及 cpu。 所有这些处理器上的线程都可以通过 science 范围进行同步。代码市里展示了跨 gpu 和 cpu 同步的场景, 我们使用 atomic store 写入系统标志,指定 order 为 release, scope 为 memory scope sis, 这样这个写入操作对所有 gpu 和 cpu 上的线程都是可见的。记住 sis 范围提供最强的同步保证,但性能开销也最大。 只在真正需要跨 gpu 或 gpu cpu 同步时,使用三种 memory scope, 从 block 到 device 再到 cis, 播放量越来越广,性能开销也越来越大。现在让我们通过对比表格来总结 memory scope 三种模式。 block 块范围覆盖范围是同一 block 性能,三颗闪电,最快 使用场景是 block 内的共享数据。 device 设备范围覆盖范围是同一 gpu 上的所有 block 性能,两颗闪电中等,使用场景是多 block 写作 sis 系统范围 覆盖范围是整个系统,包括多个 gpu 和 cpu, 性能亦可。闪电最慢。使用场景时多 gpu 或 gpu cpu 同步,从上到下覆盖范围越来越广,但性能越来越慢。让我们看性能优化建议,第一,优先使用 block, 这是最快的同步方式。第二,必要时使用 device 用于跨 block 协作。 第三,谨慎使用四 s, 因为性能开销最大。第四,选择最小满足需求的范围。记住这个原则,使用最小的 scope 来满足你的同步需求。 不要用 device 来做 block 能完成的事情,也不要用 sis 来做 device 能完成的事情,这样才能获得最佳性能。现在让我们看一个完整的实战视力生产者这消费者模式。 这是一个经典的多线城写作场景,生产者现成写入数据并设置就绪标志,消费者现成等待标志后读取数据, 让我们看完整的代码实现。首先是生产者部分使用 release 羽翼。如果当前是生产者现成,第一步,写入数据,我们创建一个 tile, 填充值为 block id, 然后使用 store 函数存储到 data array 数据库中。 第二步,使用 release 写入标志,调用 atomic store 函数设置 ready flag 为一,并指定 order 为 memory order 的 release。 这个 release 语义非常关键,它确保之前的数据写入操作对后续读取可见。接下来是消费者部分使用 acquire 语义。如果当前使用 acquire 读取标志, 调用 atomic load 函数读取 ready flag, 并指定 order 为 memory order acquire 这个 acquire 语义确保。如果读到 flag 等于一,那么生产者在 release 之前的所有数据写入都是可见的。通过 acquire 和 release 的 配合,我们建立了一个完整的同步机制,确保。

大家好呀,我是小黄人,今天咱们来学习 python 的 数据类型和数据计算。首先我们首先要弄清楚什么是 python 的 数据类型 好,首先数据类型 分为字母型 str, 有 整数型 int, 五点数型 复整数型 float, 是 不是跟 c 语言非常的像,还有什么型呢?好用的就这么多,还有布尔类型。 常用的一些数据类型,我们分为字母型 s t r, 整数型 int, 浮点数型 float, 还有布尔类型布。而我们 怎么在实际的应用中去应用它呢?我们假如我要把一个东西转换成字母型的,那我就一个 str, 后面加上一个,就是里面要转换的内容, 里面可以填文字啊,但是呢,你填文字就相当于是画蛇添足,但是呢,你填数字也是可以的, 但是请注意了,转换成整数类型也是一样的,浮点数类型也是一样的,但是整数和浮点数类型里面你就不要填这个文字了,你填文字的话,你小心他报错, 谁跟你说文字能转换成数字的?数学老师听了都得炸了,哼!好, 讲完了各个类型的转换,我们现在就来讲一下 如何通过这些数据类型来进行一些数据计算。我们现在呢,主流有很多种方法,比如说一种是把内容输入进去,保存在一个变量里面,假如我们今天来做一个实例, 今天的实力为制作一个简易的 加法计算器。好,我们来尝试一下,首先让用户输入,比如说 number 一, 让他给赋值,让他把用户输入的内容赋值一个 int 扩起来,然后里面一个 input, 我 们上节课讲了这个 input, 但是呢,这个 input 是 起到什么作用啊?是不是把这个 input 的 内容,哎,是不是给他转换成一个整数类型的东西?当然,如果用户非不听劝,在里面输入一个整数类型的东西,那么这个肯定是会报错的。 好,让任务输入,请输入第一个数字,请输入阿 阿拉伯数字,好,把这个复制过来, 然后名字叫 number two, 请输入第二个数字, 于是请输入阿拉伯数字。好,等用户输完了两个数字之后,保存在一个 number one 和一个 number two 的 变量里面。我们现在就对 number one 和 number two 进行一个处理,让它输出一下 number one, 加上这个 number number two。 啊,你也可以这样玩,最终结果为 一个这个合起来,然后呢,在里面填上一个 number one, 一个 number two, 当然你其实也可以不加这个,这个 int, 在 这个里面给它扩起来,你在这里面输入一个 int, 哎, 知道吧,你在这里面输入一个 int, 但是呢,这可能会比较麻烦,好,我们做出了这个实力,现在我们就来试一下 阿拉伯数字,比如说我随便乱输一个,他都能给我精确的计算出来,最终结果为看到没有精确的计算出来了。但是呢,给大家课外科普一下,拍粉有这样一个自带的 bug, 因为呢,这个 bug 需要使用浮点数类型,浮点数类型呢,就是小数点,知道吧,上过六年级的人应该都知道,那我们把这个类型改成 float, 让它转换成浮点数类型,以免啊,又是报错。 运行一下这个 bug, 为什么呢?就是你输入第一个数字零点一, 好,再输入第二个数字零点二,把他们加起来,很多人肯定会举手,哎呀,等于零点三,但是拍手很任性,他不这么认为。我的天,这什么玩意? 大家肯定会很懵,怎么这么三零零零零是这么多东西是怎么回事?其实呢,很多编程语言都有这个 bug, 这个 bug 是 怎么回事呢?就是他们在转换编码的时候,就是 编程语言在计算某个数字的时候,是一般都是转换编码的,然后他们在转换编码的时候出现了一点差错,基本上好像就是只有零点一和零点二这两个卧龙凤雏合在一起,才会得出零点三,零零四吧。 好,这就是 python 的 加减法运算的一个实力。可是大家有可能会好奇这个布尔类型是什么?好,布尔类型分为住 false, 好,英语精通的人就来了,处是真的意思, false 就 假的意思。对,这两个意思呢,其实是在这个 python 里面就表示的是真或者假,也可以说表示为是或者否, 相当于我们人类中的 yes 和 no。 但是呢,因为呢,这个东西呢,比较高级,所以说我们以后可能会在条件判断里面进行使用,现在呢,我们就不一一赘述,这就是我们这节课的全部内容,拜拜。

ok, 各位小伙伴,那么 python 中的关键字参数到底是什么意思呢?一个视频教大家弄清楚啊, 首先我们得明确啊,关键字参数呢,它是怎么界定的啊?来,第一个啊,如何界定这个关键字参数啊?来,就这么一句话,叫做调用时 决定,什么意思呢?来,我们定义这么一样的一个函数啊,叫 funk, 好, 有 a 和 b, 对 吧?那么这个 a 和 b 呢?我直接给它做一个打印啊, 好,先打印 a, 再打印 b, 对 吧?那么我们直接来调用一下,就正常来说,如果你的调用方式啊,你的调用方式是这个不写关键字啊, 那么就是完全按照顺序来啊,那么这个叫什么?这个叫位置参数啊, 好吧,也就是说这里呢,我们直接写 funk, 然后一和二,对吧,那么这样的话呢,你看它默认都给你填出来了啊, 位置就是按 a 和 b 的 这个顺序来的啊,好吧,那如果说你想先传 b, 或者先传什么其他的值啊,那你可以干嘛呢?可以使用这个写关键字啊, 那么就可以颠倒顺序啊,你可以颠倒顺序,好吧,啊,但他们都是属于我们第一个问题啊,属于我们的第一个问题,好吧,所以这边我们给他稍微加一点点这种描述啊, 也就是 funk, 你 可以先写 b 等于一,然后再写 a 等于二,对不对?好,那么这样写完之后呢,你来看一下啊,变成了二和一,所以呢, 我们说关键字参数如何去界,如何去界定啊?它其实跟我们定义时是没关系的,你只要在调用的时候呢,如果你没有去填这个等号的这种写法,它就默认是以位置参数的形式来调用啊,如果你写了,那就是关键字的形式啊,关键字就可以颠倒顺序,位置参数呢,就完全按顺序来决定啊。好,这是其一啊, 那么其二,我们的关键字参数能和位置参数一起用吗?来把这里全部给它注掉啊,我们来说一下第二个概念啊, 好,或者叫关键字参数能和位置参数混合使用吗?来,我们先给出个答案啊, 可以,但有限制啊,什么意思呢?我们来定义这样的一个函数啊, 它有没有 a、 b、 c 三个值啊?把 a、 b、 c 给它打印一下,好吧,然后呢,如果说正常来说,我们去再加一个吧,好吧,如果我们正常去写的话呢,我们可以用纯位置上去调用啊,比如说方可 a、 b、 c、 d, 我 们填一二三四啊,这是完全没问题的,好 结果是没没问题的,对不对?好,那我们也可以用纯的这种关键字查出来调啊,你可以先写 c、 d 等于五, b 等于一, a 等于二,这也是没问题的, 对吧?也是没问题的啊。好,那么我们能不能混合去使用呢?也就是说前面两个我用这个位置参数一和二,后面两个呢?我用这个 d 等于三, c 等于四,对吧?我给它反着来啊,能不能行呢?大家看也是可以的,对吧?但是我说的限制是什么啊?限制在这里啊, 在这个关键字参数和位置参数共同使用时啊,应该怎么样呢?应该 把关键字参数写在后面啊,就是这种写法是正确的,对吧?那么同样的写法我们这样去写啊,那我们先来写这个 a 等于一啊,然后再来写这个 b 等于二,对吧?然后 c 和 d 的 我直接让他用这个, 用这个位置参数先去写啊,这就是一个错误的写法。好吧,因为他不允许说啊,你把这个位置参数写到关键字的后边啊,所以这是一个错误写法。好,所以呢,这个就是关键字参数啊, 好吧。啊,你看完这个视频呢,应该对他有所理解啊。行,那我们这个分享到这里就结束啊。

这一小节我们将来讲解标识符的规范。好,各位,欢迎回到大师编程,我是阿森老师,那么在上一小节中,我们有介绍到拍省中的两种注色,分别是单行和多行, 那么在日常的使用中呢,单行注适用的会比较多一点,那么大家可以在配色方案里面去把这个颜色配成自己喜欢的,这是一个非常中肯的建议啊。 然后这一小节我们将来讲解标识符的规范。那么在整个拍摄规范中呢,标识符规范是一个比较重要的点, 在讲解之前,我们先来介绍一下什么叫标识符,我们讲通俗一点,它就是名称,所以呢,这个标识符规范指的就是命令规范。 好,那么有哪些名字可以命名呢?呃,你像 python 中最基础的变量名,常量名 啊,叫常量名,对吧?然后再就是函数名以及类名啊,有很多种命名,那那么它们都要遵守哪些规则呢?我们一起看一下。 首先啊,我们讲 python 中的标识符是有一个有效的符设定的,它可以包含字母,数字,下划线, 那么对于字母来说呢,大小写均可,但是它是区分大小写的,也就是说现在给你一个变量叫做 t 啊,给你一个小写的 t, 它们两个是完全不一样的,搞清楚,并且呢, 呃, python 中其实是支持这个中文变量的啊啊,在那个 python 三之后是支持的,但是也不建议使用啊,不建议使用中文变量好吧,呃,这是有效制服, 那么呃,通过这个描述我们可以得知啊,这个 variable verb 下划线加 e 以及 print 下划线和漏都是符合要求的。好,那么第二个呢,叫做命名规则啊,这个命名规则,呃,说白了就是强制要求, 首先呢,在满足你是有效制服的情况下,你不能以数字开头,如果我们这里写上一个 points 三,那是有效的,但是呢,如果你写的是三 points, 那 它就是一个无效命名,会报错的 好,那么第二个强制性要求就是 python 的 关键字不能用做标识符。那么什么叫关键字呢?就比如说 if, for 和 well, 这么未来的语句结构中可能会出现的就叫关键字。那么 python 中的关键字有哪一些呢? 我们可以看一下,喏,这里说的是一个保留字,对吧?那么保留字它就是关键字加上了未来可能使用的关键字的一个集合体啊,那么有这么多,那么这些你都不能用, ok 啊,那么这个就是强制性的规则, 然后下方有一个命名,命名的就给你一个建议,对吧? 比方说它的第一个建议是什么呢?啊?你的变量名通常是用小写字母,如果有多个单词组成呢,那么单词之间可以用下划线来分割,比如说这个 snake case。 好, 第二个函数名,它和变量名是一模一样的,它基本上都要使用那个小写字母,单词之间呢,也是用下划线来分割,比如说这个计算总数的 calculator sum, 那么他就是同样的命名方式啊,所以这个变量名和函数名你可以一起记,对吧?呃,那么到了类名这里呢,就稍微有一点点区别了,他是使用的一个驼峰命名法哎,有这么一个命名法叫做驼峰命名法, 那为什么是驼峰呢?因为你发现它多个单词之间的首字母都是大写的,就像是骆驼一样的,对吧?啊,我们有那个起伏啊,所以叫驼峰命名法好,所以这个地方出现了一个 my class, 就是 我的类,对吧?类名,你看第一个单词 my 和第二个 class 手这么多大写,然后这个银行的账号啊,一个这样的类,对吧?也是 b 和 a 都大写了,那么这个就是类名,当什么类名是干什么用的啊?这个我们会在面向对象编程相关的章节去讲,这里我们只是稍微提一下。好,然后再就是常量啊, 常量呢,它的命名全部是大写,比方说我们要去表示一个最大的尺寸,我们就 max size, 中间仍就是用下划线给他分割,然后再就是当你去表示那个圆周率的时候啊,你可以用这个派 对吧,都是大写啊,为什么我们要讲圆周率?因为圆周率他是一个恒定不变的量。说,如果说啊,我要给他去定义成一个量啊,那就是常量,对吧?好,那么这个是命名约定啊,大家,呃,照这个去做总归是没问题的。 然后再下一个就是特殊的标识符了,就是说啊,在我们某些特定的场景下,我们可能要用到下划线和双下划线。 好,但是这个呢,我现在给你们讲太早了,好吧,呃,到时候我们用到的时候再去讲啊,你注意有这么个玩意啊,它也是影响我们命名的,叫特殊的标识符, ok 啊,那么其他建议的话呢?呃,就大家容易读懂的一些了,就比方说,哎,尽量选择具有描述性的名称,以提高代码的可读性, 就好比什么呢,我现在要表示那个苹果手机的价格,我写个 x 等于一,呃,就等于五千九对吧,或者说是 苹果手机的什么呢?单价等于五九零零啊,你不要看着说我这个 x 好 像简单多了,但是呢它的可读性远没有这个这么高,对吧?叫苹果手机的价格啊,所以建议大家是使用描述性的名称键名之一啊。 那么第二个避免使用单个字母作为标识符,除非在循环缩影或其他特定的情况下,也就是说像这种 a 呀, x 和 i 你 少去定义啊,当然什么时候要定义呢?我们到时候讲循环的时候会讲到这个单个字母作为标识符的情况啊, 所以这个尽量避免好吧。呃当然还一点是什么呢?就是我们在做测试的时候,就是我们在做学习的时候,如果仅仅只是为了表示一个数据,我随便去写个 x, 那 么你们就不要说,哎,老师 你不是说尽量避免吗?呃就不要再说了啊,因为我们只做学习好不好啊,我这里说的是工作中啊,尽量避免 ok 啊。那么最后一点的话呢,就是一个比较主观的内容了,就尽量使用一致的命名约定啊,有助于代码风格的统一。 所以说你如果带个团队啊,大家命名方式都差不多,那么你整合出来的项目就非常的优雅对吧?好,那么这个呢是有关于标示符的规范的一个描述,那么这里我们做一些小小的测试吧。 呃,稍等一下啊,我打开那个界面,好 在这个位置呢,我们来写一下所谓的不满足强制性要求的啊,就是不符合 强制性要求的。好,那我们之前在讲强制性要求的时候给它归类,为什么呀?就就是那个命名规则,对吧?好,你看,当我去写一个 word 这个单词,对吧?等于一是没问题的。好,那么我写上一个 print hello, 好,它也是没问题的,对吧?好,那么如果说我一旦没有满足这个强制性要求啊,重点是什么呢?不能以数字开头啊,那我这里偏偏要以数字开头,你看啊, 我先把这个数写这里,没问题,对吧?然后把这个数字写这里呢?哎,你发现报错了啊,然后关键字也不能作为标识符啊,就比如说那个 if, 我 作为标识符,哎,没用,对不对?好,我用那个 well 呢, 也没用好,所以这是关键字啊。当然,如果说我们违反的命名约定啊,呃,就比如说它让我们在变量命名的时候尽量用到那些。 呃,小写加下划线给它连上。那如果不照这个要求做啊,我就要写上一个 snake case, 好, 报错没有? 事实上呢,它是没有报错的,对吧?它是没有报错的,但是它说了一个什么呀?叫做 p e p 八 w 三九幺,什么什么东西,对不对?好,所以它就是一个警告啊, p e p 八,这个就是 python 的 规范啊,到时候我们会讲到啊,你只了解它是一个 python 规范,那么这里报了警告就证明你不满足它的要求,你给它换成什么呢? snake case 保存一下,好给它回一下啊,这个是什么呀?第五行啊,那个 file 我 看一下啊。呃,第五行,这不是它不满足,对吧? 好,这个就没了,对不对? ok 啊,然后我给它换成那个 snake 的 一个 case, 等于五好。哎,它没有提示啊啊?给了提示,这是一个 ai 操作啊。 啊,没什么毛病啊。他没有没有给提示啊,但这个不要紧,但你肯定是一个错误的。好,我写上一个中文啊,等于我啊,他这个就给了提示。叫什么?叫飞飞飞,什么制服,对不对?好, 行吧。呃,那么建议大家呢,就尽量按照我的要求去做就 ok 了,好不好?行吧,那我们这一节到这里就停下来。

拍蒜中的类和对象到底是什么?简单来说,类是抽象的概念,而对象则是类的具体实力。可以理解为类是一个抽象的模具,他提前定义好了形状、大小等基本属性,这个模具是固定不变的,能用它做出无数个成品,而对象就是依靠这个模具制作出来的成品, 每个成品既继承了模具的核心特征,又拥有自身专属的属性和行为。接下来我们来看看案例,类通过 class 关键自定义,后面跟着的 cat 是 类名。接下来这段代码叫抽象方法,双向划线就是它的身份标识。通过抽象方法给类创建属性,其中 self 参数表示对象自身,用来绑定属性和对象。 抽象方法中 self 后的参数是创建时需传入的内容,通过 self 点属性名为传递过来的变量赋值,这样类的属性和实力化对象就绑定好了。类中还可以定义其他方法,这些方法与普通函数的定义方式类似。至此,一个 cat 类就创建完成了。 接下来创建实力对象,通过类名加括号调用类的抽象方法传入具体参数,就能创建出类的实力对象。用同样的方法可以创建多个对象。最后通过对象名、点属性名或方法名就能访问对象中定义好的属性和方法啦。