前话

我很佩服设计Python这门语言的人,因为这门语言的规则让我不得不写出美观的代码。

Python的缩进要求是强制的,因为缩进不对直接影响了代码逻辑。

因为python写法相对其他编程语言简化许多,没有花括号让我对代码分块摸不着头脑。

因此刚开始学的时候,多种文本编辑器自动补全def,while,if else 时会在结尾自动添加 pass ,这导致我误认为python的类,函数结束符号为pass

谷歌才发现pass作用是占位提示,不做其他任何事情 (:3」∠)

那么python是怎样代码分块呢?我就不废话了,没错就是缩进,这个缩进可以使Tab键缩进,或者4个空格键代替Tab缩进。


python缩进哲学

python设计者是这么认为的:

类似C、Java等语言用花括号{}来区分代码块,初学者或者语言编写较为豪放者会不注意代码编写风格,花括号内随便写,分布分行,缩进不缩进不影响代码逻辑,这会导致破坏代码的层次结构,让人难以阅读。因此许多老手会不断给新手们提示要注意缩进,让代码美观,避免给自己后人留坑。

何不把美观和逻辑结合在一起?

终于,这套强制性的python编写规则出来了,你要学python,你必须代码美观。


python缩进规则

栗子一

大家看下面这段代码:

def sayHello():
print('Hello World!') sayHello()

乍看以为结果是输出Hello World ,执行以下,结果是什么都没输出。

其实就是缩进在作怪了,下面图片拆分代码块,相同颜色框在一起说明他们是属于同一代码块,导致这段代码只是定义了一个函数,但是并未执行它。

因此正确写法是:

def sayHello():
print('Hello World!') sayHello()

可以看到 sayHello() 前进了一个缩进,这时再执行这段代码就可以看到万恶的 Hello World 了。

因为代码块变成了这样,因此上面一个代码块定义了一个函数,下面的代码块是执行函数。


栗子二

看这个有关类的代码:

class Student(object):

    def __init__(self, name):
self.name=name
def say(self):
print('I\'am',self.name) def getName(self):
return self.name stu=Student('pwc')
stu.say()
print('Hello',stu.getName())

执行以下,发现报错了,错误提示是getName属性不存在!!!

其实再分析一下代码块,可以看出,噢,getName函数位置不对,它被写在say函数里面了。

因此正确写法是:

class Student(object):

    def __init__(self, name):
self.name=name
def say(self):
print('I\'am',self.name) def getName(self):
return self.name stu=Student('pwc')
stu.say()
print('Hello',stu.getName())

然后可以看到正确输出了。


好了我就简单举了两个例子,只要记住缩进影响逻辑,相信其他代码大家也能得心应手的控制了。

Python3缩进对逻辑的影响的更多相关文章

  1. 简明Python3教程 6.基础

    你肯定不满足于只打印"Hello World"吧? 你想要的更多 - 你希望得到一些输入,操纵它后再从中得到某些东西.我们可以使用python中的常量和变量实现这些功能. 字面常量 ...

  2. vim格式化代码实际上就是 "缩进代码", 命令是等号=

    vim格式化代码实际上就是 "缩进代码", 命令是等号= 格式化就是 vim 根据 文件的类型, 自动的对代码进行 缩进 缩进的类型有多种, 都是用等号命令: = 全部格式化 : ...

  3. Ubuntu中安装python3.6(转)

    因为TensorFlow只支持到python3.6,所以安装python3.6版本 Python3.6的使用越来越普遍.Ubuntu16.04的版本中默认胸自带python2和python3.5的版本 ...

  4. 怎样用 Bash 编程:逻辑操作符和 shell 扩展

    学习逻辑操作符和 shell 扩展,本文是三篇 Bash 编程系列的第二篇. Bash 是一种强大的编程语言,完美契合命令行和 shell 脚本.本系列(三篇文章,基于我的 三集 Linux 自学课程 ...

  5. 打造一款属于自己的CentOS操作系统

    文章目录 声明 关闭selinux以及firewalld 修改终端前缀显示 修改默认网卡名称为eth0 替换yum源 安装常用工具 优化history 配置回收站 迎宾显示 优化vim 清空yum缓存 ...

  6. python基础-面向对象进阶

    一.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...

  7. Python之路【第六篇】python基础 之面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象  和  issubclass(su ...

  8. 初窥Kaggle竞赛

    初窥Kaggle竞赛 原文地址: https://www.dataquest.io/mission/74/getting-started-with-kaggle 1: Kaggle竞赛 我们接下来将要 ...

  9. 分享总结:更好地CodeReview

            代码质量分享    2016_06_24_舒琴_代码质量.key    For 代码提交人     基本原则 Review时机: 对于普通bugfix或优化,CodeReview最迟要 ...

随机推荐

  1. TI IPNC Web网页之流程分析

    流程 Appro IPNC使用的web服务器是boa. 请仔细理解下面这段话. boa这个web服务器是GUI界面和IPNC应用程序之间的通信的桥梁.它的责任是从web GUI中接收HTTP请求,并且 ...

  2. Swing做的非阻塞式仿飞秋聊天程序

    采用Swing 布局 NIO非阻塞式仿飞秋聊天程序, 切换皮肤颜色什么的小功能以后慢慢做 启动主程序. 当用户打开主程序后自动获取局域网段IP可以在 设置 --> IP网段过滤, 拥有 JMF ...

  3. Careercup - Microsoft面试题 - 5428361417457664

    2014-05-11 03:37 题目链接 原题: You have three jars filled with candies. One jar is filled with banana can ...

  4. ACK

    ACK (Acknowledgement),即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符.表示发来的数据已确认接收无误. 目录 1基本介绍 2详细释义     1基本介绍编辑 英文缩 ...

  5. Java多线程——<八>多线程其他概念

    一.概述 到第八节,就把多线程基本的概念都说完了.把前面的所有文章加连接在此: Java多线程——<一>概述.定义任务 Java多线程——<二>将任务交给线程,线程声明及启动 ...

  6. Leetcode#117 Populating Next Right Pointers in Each Node II

    原题地址 二叉树的层次遍历. 对于每一层,依次把各节点连起来即可. 代码: void connect(TreeLinkNode *root) { if (!root) return; queue< ...

  7. NYOJ-235 zb的生日 AC 分类: NYOJ 2013-12-30 23:10 183人阅读 评论(0) 收藏

    DFS算法: #include<stdio.h> #include<math.h> void find(int k,int w); int num[23]={0}; int m ...

  8. Drawing with GoogLeNet

    Drawing with GoogLeNet In my previous post, I showed how you can use deep neural networks to generat ...

  9. Data manipulation primitives in R and Python

    Data manipulation primitives in R and Python Both R and Python are incredibly good tools to manipula ...

  10. [百度空间] [原]DLL导出实例化的模板类

    因为模板是在编译的时候根据模板参数实例化的,实例化之后就像一个普通的类(函数),这样才有对应的二进制代码;否则,没有模板参数,那么编译器就不知道怎么生成代码,所以生成的DLL就没有办法导出模板了.但是 ...