Python难懂?买一次西瓜就懂了!

640?wx_fmt=gif&wxfrom=5&wx_lazy=1


什么是code?


code就就是一种语言,一种计算机能读懂的语言。计算机是一个傻*,他理解不了默认两可的任何东西。比如,你让你老公去买个西瓜,你老公会自己决定去哪里买,买几个,找个搞活动打折的买,总之,你给他钱,他就给你买回来让你吃到爽的西瓜。但是,你想让计算机买一个西瓜?你要告诉他:去门口的鲜丰水果店买,买沙瓤无子西瓜,若旁边的店打折,就去旁边的店买。总之,你不能让计算机做任何决定,你要清楚的告诉他所有情况下的所有的行为。而code,就是你和计算机交流的语言,或者说是对计算机的命令。


我们就把计算机理解为一个人,这个人很死板,只能按照你给他的详细命令进行工作。而这个人工作速度特别特别快,并且保证工作结果都是正确的。


编程语言其实不重要,重要的是要明白如何和计算机交流,明白了这个也就能看懂代码了。



编程 = 算法 + 数据结构


python就是一种和计算机交流的语言,这种语言单词(关键字)不多,规则也少。下面所有的内容都基于python。


1、判断


当你命令计算机做一件事情的时候,这件事情可能分一些情况进行处理。

判断通常涉及到的关键字有:if , else, elseif, and, or,<, >,=,<=,>=,==


比如,你让计算机买西瓜,希望买到打折的西瓜,不打折的话你就不吃了。


if  水果店打折:

    买西瓜

else:

    不买了


通过这个命令,计算机变得更智能了一些,他可以根据情况执行你的命令。


水果店不打折你就吃不到西瓜,你不开心。那么,我们让计算机更智能一些。假如西瓜打折,就买西瓜;不打折的话让计算机跟老板讲价,老板同意打折,就买西瓜;不同意,不吃了;


if  水果店打折:

   买西瓜

else:

   与老板讲价

   if 讲价成功:

     买西瓜

   else:

    不吃了。


虽然和老板讲价一般都能讲成功,但是有的老板给力给打五折,有的老板只给打九折。你就想了,若老板打五折,我就买两个,今天吃一个,明天吃一个。若老板不给力,打折不到五折,就买一个,今天先吃,明天再说。


if  水果店打折:

    买西瓜

else:

    与老板讲价

    if 打折成功 and 打折力度<=5:

       买两个西瓜

    elseif 打折成功 and 打折力度 > 5:

       买一个西瓜

    else:

       不吃了。


此外,有没有发现,打着成功这段代码其实也可以写成:


if 打折成功:

    if 打折力度<=5:

        买两个西瓜

    else:

       买一个西瓜

    else:

       不吃了。


由此可见,计算机也不是完全的一成不变,只要你给他的命令他能理解并且不会默认两可,他都可以完成工作。


and的意思代表且,or的意思代表或。and和or的顺序不同,结果也不同,可以通过括号来说明判断条件的优先级。


a==b是比较a和b是否相等的意思,而=代表赋值。赋值的含义,我在下面的变量章节介绍。


2、循环


python中涉及到循环的关键字包括:for…in… ,while,break,continue


上面的例子我们已经让电脑成功的可以根据不同的情况去水果店买西瓜了,但是若老板不打折,你就吃不到西瓜了。这时,你就想了,咱们小区门口有三家水果店,分别是鲜丰水果、四季水果和路边摊,一家不打折不代表三家都不打折啊,所以你希望电脑可以去三家都去看看,挑一家打折的店买西瓜。


for 水果店 in (鲜丰水果、四季水果和路边摊):

      if 水果店 打折:

         买西瓜

         break(循环结束)

      else:

         啥都不做

带西瓜回家


循环的意义在于,可以用电脑对不同的对象执行相同的命令。


介绍下break,break的意思就是结束循环。比如,这段代码中的break表示,我们一旦买了西瓜,那么就带西瓜回家。


3、变量


现在是时候介绍’变量’这个重要的东西了。


我们依然把电脑理解为帮我们工作的一个人,那么作为一个人,他需要有记忆力,而我们就可以通过变量去控制、利用计算机的记忆力。


变量可以理解为计算机的一个记忆单元,计算机拥有极好的记忆力,所以,可以随心所欲的使用,用完了就扔,需要了就要。(当然,说随心所欲是不严谨的,但是你可以理解为随心所欲)


那为什么叫变量呢,就是因为可以改变。为什么要改变呢?比如我们都有自己的年龄,我今年18,明年就19了。所以,’年龄’在我的记忆里是每年改变的。


变量对应的一个东西叫常量,在我的记忆力,我的老婆是江江同学。而这个’老婆’这个记忆单元在我的脑子里是不会变的,她永远都是江江同学。常量你现在可以不用理解,我写主要是为了秀恩爱。


现在,计算机又要去买西瓜了。不过这次,你希望计算机可以在三个水果店中,找到一个打折力度最大的水果店去买水果。


之前所有水果店的最大折扣 = None

之前给最大折扣的水果店 = None

for 水果店 in (鲜丰水果、四季水果和路边摊):

     当前水果店折扣 = 老板给的折扣

     if 当前水果店折扣 < 之前所有水果店的最大折扣:#4折比5折力度大

         之前所有水果店的最大折扣 = 当前水果店折扣

         之前给最大折扣的水果店 = 水果店


去 之前给最大折扣的水果店 买一个西瓜


以上有以下几个记忆单元:


  • 之前所有水果店的最大折扣

  • 之前给最大折扣的水果店

  • 当前水果店折扣

  • 水果店 注意,for a in b,a也是一个变量,他在每次执行的时候都是b中的当前执行的一个元素。


这里需要介绍一些概念:


  • None 在python中表示空,表示这个记忆单元现在啥都没有。比如在我情窦初开时,脑海中就已经有了情人这个记忆单元,我一直在寻找,但遇到你之前一直没有找到,所以那段时间这个记忆单元里面一直是空。

  • 赋值符号:=。 注意,在计算机语言里面,一个’=’号表示赋值,两个等号’==’表示比较前后元素。赋值的意思是,把后面的元素,放到前面的变量里面。


变量的作用域


作用域这个东西非常重要,但是真心不想讲,因为没办法结合现实的例子,不过还是大体说明下。


还是刚才的例子,我加了行号,并且我使用-代表空格,表示代码的缩进。


1 之前所有水果店的最大折扣 = None

2 之前给最大折扣的水果店 = None

3 for 水果店 in (鲜丰水果、四季水果和路边摊):

4 ---当前水果店折扣 = 老板给的折扣

5 ---if 当前水果店折扣 < 之前所有水果店的最大折扣:#4折比5折力度大

6 ------之前所有水果店的最大折扣 = 当前水果店折扣

7 ---之前给最大折扣的水果店 = 水果店

8 去 之前给最大折扣的水果店 买一个西瓜


你看这个例子可能纳闷,为什么要先给’之前所有水果店的最大折扣’、’之前给最大折扣的水果店’这两个变量赋值为None呢。就是因为作用域问题。


你看这个程序,每行代码的缩进都是不一样的。变量作用域可以理解为:一个变量,只有在其第一次出现的地方的缩进,以及缩进更多的代码里面,才有效。我们第1、2行的变量,就可以用于3-8行,因为这些代码的缩进都在1、2行的后面。而第四行的变量’当前水果店折扣’,只在5、6、7行有效


1  A = None

2  ————B = None

3  ————..

4  ————————C = None

5  ————————..

6  ————D = None

7  ————..

8  ————————..

9  ————————..

10 ..

11 ..


再举个例子,ABCD是变量,..代表某些代码。A的作用域就是1-11行,即1-11行都可以使用A。B的作用域是2-9行,C的作用域只有4-5行,注意,8-9行就不能再使用C了,虽然他的缩进和4、5行一样,作用域遇到第一个不能用缩进行代码即结束。D的作用域就是6-9行。


4、函数


看懂以上几节,大概应该明白计算机如何执行代码的了。


而函数和模块,和之前的介绍不太一样。之前是介绍如何让计算机工作,是面向计算机的。而这一节,是面向人的,是如何让我们写给计算机的代码看起来更加简洁、明了。函数和模块都是对代码结构的优化,否则一个稍微大点的项目,一大坨代码,计算机看得懂人看不懂,不利于管理和交流。


首先说函数。函数是一系列代码的集合,用函数一般是有几个原因:


1.给一段代码起个名字。

2.这段代码和使用它的代码关系不大,所以可以抽出来,抽出来后代码更简洁。关系不大的意思就是:使用函数的代码通过传给函数几个参数,函数就可以执行。

3.代码集合起来就可以在代码的不同地方使用。


依然我们去买西瓜,不过我们希望电脑可以今天买完西瓜明天再买一个。按照之前的方式,这个逻辑应该写成这样:


for 水果店 in (鲜丰水果、四季水果和路边摊):

      if  水果店打折:

          买西瓜

       else:

         与老板讲价

         if 打折成功 and 打折力度<=5:

            买两个西瓜

         elseif 打折成功 and 打折力度 > 5:

            买一个西瓜

         else:

            不吃了。


休息一天。


for 水果店 in (鲜丰水果、四季水果和路边摊):

      if  水果店打折:

          买西瓜

      else:

         与老板讲价

          if 打折成功 and 打折力度<=5:

             买两个西瓜

          elseif 打折成功 and 打折力度 > 5:

            买一个西瓜

          else:

            不吃了。


上面的代码可以实现我们的要求,但是买西瓜的代码其实是重复的,对于重复代码,管理起来比较麻烦,比如你想改一点,那么就要去各个地方都改一次。


那么,我们把买西瓜的代码弄成一个函数,代码就可以整理为:


def 买西瓜_函数():

      for 水果店 in (鲜丰水果、四季水果和路边摊):

            if  水果店打折:

                买西瓜

            else:

               与老板讲价

               if 打折成功 and 打折力度<=5:

                  买两个西瓜

              elseif 打折成功 and 打折力度 > 5:

                  买一个西瓜

              else:

                  不吃了。


买西瓜_函数()

休息一天。

买西瓜_函数()


这一次,代码整洁多了,而且,我们每次想修改买西瓜的代码,都只需要改这个函数一处代码都可以。


在python中,使用def function_name():定义函数,函数下面所有的缩进都属于这个函数,叫函数体。


使用function_name()调用函数。


4.1 函数参数


现在你又不满足与电脑只会买西瓜了,你又想吃柚子。怎么办呢,那么是不是我们又要写一个买柚子的函数呢。


当然可以再写一个买柚子函数,但是买柚子函数的逻辑和买西瓜函数的逻辑都是一样的,命令也一样,唯一的区别就是之前是卖西瓜,现在是买柚子。如果再写一个类似的买柚子函数,那么又出现刚才说的问题,每次修改买水果的逻辑,都需要同时去修改买西瓜、买柚子函数,如果柚子吃腻了,又要买香蕉、苹果、梨,岂不是要写非常多的函数?


为了解决这个问题,其实有一个更好的方法,就是使用函数参数。


由于我们买水果(无论是西瓜、还是柚子)的功能都是一样的,所以我们可以写一个买水果函数,买水果函数定义了买一个水果的流程,当我们使用这个函数的时候,我们只要告诉这个函数我们要买什么水果,函数就可以根据你告诉他的水果名,去买对应的水果。


买水果函数的代码如下:


def 买水果函数(水果名):

      for 水果店 in (鲜丰水果、四季水果和路边摊):

            if  水果店打折:

                买[水果名]

            else:

               与老板讲价

            if 打折成功 and 打折力度<=5:

                  买两个[水果名]

             elseif 打折成功 and 打折力度 > 5:

                  买一个[水果名]

             else:

                  不吃了。


买水果函数(西瓜)#让电脑去买西瓜

买水果函数(柚子)#让电脑去买柚子


在python中想使用函数参数,只需要在函数定义的时候,在括号里面加上参数即可,我们这里的参数就是’水果名’。在函数体中代码可以使用函数参数。


在调用函数的时候,把一个变量或者常量写在函数名后面的括号里面,传给函数。


注意,若是存在多个参数,函数定义和调用函数的参数顺序一定要一致。


在python中,还存在默认参数、关键字参数等稍微高级一点的使用方式,举个例子,不详细说明了。


def sum(a, b = 0,c = 1):#b/c是默认参数

    return a+b+c


func(1,0,1)

func(1)

func(1,c=1)


这三个func调用的结果都是一样的。


5、模块


刚才我们已经讲了函数,函数就是把代码整合起来。而模块,就是把更多代码整合起来。


模块和函数的引入是为了解决类似的问题:管理代码段,并且给他们起一个名字。


一般来说,一把模块就是一个py文件,里面可能包括很多函数,也可以包括一些类的定义(这个我们后面讲哦)。


模块的引入就是为了将代码更好地管理。


我们把代码放在一个py文件中,这个py文件就是一个模块,在其他py文件里面,我们就可以使用import关键字,将模块引入。


比如,我们现在有一个a.py文件,里面有一些函数,比如buy_xigua,buy_youzi等,若我们想在b文件中使用这些函数,那么我们必须在使用前,导入a模块。


导入一个模块并使用模块里面的函数有很多方法,我把常见的方法列在下面.


方法一:


import a

a.buy_xigua()

a.buy_youzi()


这种方法导入模块a,然后通过模块.函数调用函数。


方法二:


from a import *

buy_xigua()

buy_youzi()


这个方式导入模块a中的所有内容,可以直接使用。


方法三:


from a import buy_xigua,buy_youzi

buy_xigua()

buy_youzi()


这个方式导入模块a中的指定内容,可以直接使用,一般这种方法在软件开发过程中使用的比较多,原因是我们只把需要的内容导入使用,不需要的不导入。(按需使用别浪费,在哪里都是个好习惯,深层原因超出教程范围)


6、类和对象


类和对象的概念,对于没有接触过编程的同学来说,可能稍微有些不好理解。我记得当年第一次接触这个概念,也迷糊了段时间。


之前,我们介绍过‘变量’。变量的引入,是为了描述程序内的记忆单元。一个变量可以是一个数字,也可以是一个字符串(比如设置一个变量 名字='水风')。


但是,有些东西需要使用很多变量共同描述才可以。比如,一个买西瓜的人。买西瓜的人有很多特征,比如:名字、存款,持有西瓜数量。此外,买西瓜的人也有一些行为,比如买西瓜这个行为。为了实现买西瓜的人这个功能,我们引入类和对象的概念。注意,类/对象引入想解决的问题和函数、模块所解决的问题不一样。函数和模块的引入更多的是为了管理代码,而类/对象的引入是为了把状态和行为封装在一起。


那么,类和对象分别是什么意思呢。类是我们定义的一种东西有哪些状态和行为,比如买西瓜的人有状态和行为,我们提前定义好他们,类的概念是一种虚拟的。而对象就是代码在执行的过程中,去动态创建、生成的一个实体。


比如买西瓜的人


我们之前写了买西瓜的流程,现在我们想创建两个买西瓜的人,每人负责一天,这样买西瓜的人也可以休息了。


来源:代码湾

文章版权归原作者所有,转载仅供学习使用,不用于任何商业用途,如有侵权请留言联系删除,感谢合作。

640?wx_fmt=png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宠粉老鱼皮带你 “入坑” GitHub!

昨天刚刚教大家 如何更快地访问 GitHub&#xff0c;按照惯例&#xff0c;今天不得来一个 GitHub 教程&#xff1f;最近&#xff0c;鱼皮在持续完善自己 GitHub 上的开源项目&#xff0c;也分享给了很多小伙伴&#xff0c;苦苦哀求大家可以给个 star。liyupi 的 GitHub但是&…

统计学入门需掌握的四点思想

大家晚上好&#xff0c;自从小天悄悄报名Power Query课程并利用休息时间学习&#xff0c;结果因为太嗨被超模君发现了之后&#xff0c;小天又多了一个任务&#xff1a;利用统计学知识处理和分析之前累积的大量数据。&#xff08;抱歉&#xff0c;暴露超模君老是鞭策我的事实了&…

UML常用图的几种关系的总结

在UML的类图中&#xff0c;常见的有以下几种关系: 泛化&#xff08;Generalization&#xff09;, 实现&#xff08;Realization&#xff09;, 关联&#xff08;Association), 聚合&#xff08;Aggregation&#xff09;, 组合(Composition), 依赖(Dependency)1. 泛化&…

linux编程两个子进程,Linux中fork同时创建多个子进程的方法

怎么创建多个进程呢&#xff1f;我说那还不容易&#xff0c;看下边代码://省略必要头文件int main(){pid_t pid[2];int i;printf("This is %d\n",getpid());for(i 0;i < 2;i ){if((pid[0] fork()) < 0){printf("Fork() Error!");exit(-1);}if(pid[…

我为什么鼓励你读计算机博士

看过《水浒传》的朋友都知道&#xff0c;梁山的一百单八将因为各种理由加入了水寨&#xff0c;走上了劫富济贫、替天行道的路。我2006年从南京大学本科毕业以后&#xff0c;耳闻目睹了数百位计算机专业的博士&#xff08;生&#xff09;&#xff0c;他们选择读博士的理由可以说…

一日一技:在Ocelot网关中统一配置Swagger

概述Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。在Ocelot网关中&#xff0c;我们提供给前端的直接是Swagger&#xff0c;如果Swagger分布在各个API中&#xff0c;前端查看Swagger的时候非常不便&#xff0c;Ocelot与Sw…

Oracle Solaris 11 Express发布了

甲骨文Solaris 11 Express操作系统在Solaris 10的基础上进一步加强了各种功能&#xff0c;Solaris 11 Express将为关键的企业系统环境提供最佳的UNIX体验(与之相对应的是Oracle Enterprise Linux&#xff0c;将提供最优的Linux体验)。举例而言新系统中基于网络的包管理工具(pac…

自从我上了数据结构课之后……

在 Reddit 上看到一个英文帖子&#xff0c;问&#xff1a;上了数据结构课后&#xff0c;还有正常生活么&#xff1f;有人引用了 Quora 上的一个英文回答&#xff0c;大意如下&#xff1a;嗯&#xff0c;没有&#xff01;你看东西的眼光&#xff0c;不可能和以前一样了。不管你信…

如何在 C#9 中使用 static 匿名函数

匿名函数 在 C# 中已经出现很多年了&#xff0c;虽然匿名函数用起来很爽&#xff0c;但代价是不小的&#xff0c;为了避免不必要那些你意想不到的内存分配&#xff0c;这就是为什么 C#9 中引入 static 匿名函数的原因&#xff0c;这篇文章我们将会讨论如何使用 静态匿名函数 以…

Linux 远程桌面 rdesktop 软件

为什么80%的码农都做不了架构师&#xff1f;>>> 众所周知XP下有"远程桌面连接"用来远程登录桌面&#xff0c;设置也非常简单。那有没有什么办法在linux 下远程登录到XP呢&#xff1f;有。用rdesktop这个linux下的软件就能实现。 发现新立得也有下载&…

linux进程的高级管理,Linux高级程序设计(第2版) PDF扫描版[94MB]

Linux高级程序设计(第2版)以Linux操作系统(内核为2.6版本)为开发平台、GCC 4.0/GDB 6.3为开发调试环境&#xff0c;详细介绍了Linux系统下编程环境及编程工具、文件管理(文件类型、ANSI以及POSIX标准下文件读写操作)、进程管理(创建、退出、执行、等待、属性控制)、进程间通信(…

人工智能的算法黑箱与数据正义

前段时间&#xff0c;《终极算法》作者、人工智能著名学者、华盛顿大学教授 Pedro Domingos 在社交网络中写道&#xff1a;“自 5 月 25 日起&#xff0c;欧盟将会要求所有算法解释其输出原理&#xff0c;这意味着深度学习成为非法的方式。”一石激起千层浪。人们不禁要问&…

快速了解C# 8.0中“可空引用类型(Nullable reference type)”语言特性

Visual C# 8.0中引入了可空引用类型&#xff08;Nullable reference type&#xff09;&#xff0c;通过编译器提供的强大功能&#xff0c;帮助开发人员尽可能地规避由空引用带来的代码问题。这里我大致介绍一下可空引用类型的基本内容。刚开始接触这个语言特性的时候&#xff0…

为什么软件工程师找不到工作?我想分享四个“恐怖故事”

编者按&#xff1a;作为一个程序员&#xff0c;如果没有收到心仪的工作offer&#xff0c;你是不是会对自己失去信心&#xff1f;对接创业者和程序员的网站coderfit.com 的创始人Iwan认为你无须担心。他分享了四个“恐怖故事”&#xff0c;告诉我们——那些厉害的工程师被拒绝的…

使用GZipStream实现压缩和解压缩

概述之前做项目&#xff0c;涉及到存入到数据库或者http传输的数据量比较大&#xff0c;这个时候&#xff0c;就需要考虑在存入数据库或者发送传输之前&#xff0c;将数据压缩下&#xff0c;当从数据库中取出时&#xff0c;再解压还原数据。特地找了下发现有GZipStream可以实现…

linux 核显驱动程序,支持下代核显 Intel放出Linux图形驱动

【IT168 资讯】虽然Ivy Bridge处理器的发布因为策略原因被推迟到2012年3-4月份&#xff0c;但是Intel在硬件、软件的开发上进展颇为顺利&#xff0c;近日还放出了新款Linux开源图形驱动&#xff0c;已然支持Ivy Bridge中的整合图形核心。▲Intel新款Linux开源图形驱动Chris Wil…

看完此文再不懂区块链算我输:手把手教你用Python从零开始创建区块链

导读&#xff1a;如果你还没有听说过 3 点钟区块链群&#xff0c;说明你还不是链圈的人&#xff1b;如果你还没有加入 3 点钟区块链群&#xff0c;说明你还不是链圈的大佬&#xff1b;如果你还没有被 3 点钟区块链群刷屏&#xff0c;说明你还体会不到什么是“币圈一天&#xff…

过于在意别人的看法,怎么办?

大家好&#xff0c;我是Z哥。你有特别在意别人的看法吗&#xff1f;如果从别人那里听到对自己不好的评价会不会导致一整天都闷闷不乐&#xff0c;做事都没心思&#xff1f;如果从别人那里听到对自己好的评价会不会做起事来都像打了鸡血一样&#xff1f;我相信每个人都会在意别人…

linux 虚拟机挂载本地,CentOS 在VMWare中挂载本地yum源

准备工作虚拟机 VMWare系统 CentOS 7 镜像一、挂载镜像操作之前点击 虚拟机设置 CD/DVD处勾选 设备状态[x] 已连接[x] 启动时连接挂载镜像mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom二、创建yum配置mv /etc/yum.repos.d /etc/yum.repos.d.back mkdir /etc/yum.repos.d三、创…

干货整理:处理不平衡数据的技巧总结!收好不谢

文&#xff1a;Rick Radewagen译&#xff1a;李萌在银行欺诈检测&#xff0c;市场实时竞价或网络入侵检测等领域通常是什么样的数据集呢&#xff1f;在这些领域使用的数据通常有不到1&#xff05;少量但“有趣的”事件&#xff0c;例如欺诈者利用信用卡&#xff0c;用户点击广告…