Python编程思想(2):Python主要特性、命名规则与代码缩进

Stella981
• 阅读 609

上一篇:Python简介与开发环境搭建

李宁老师已经在「 极客起源 」 微信公众号推出《Python编程思想》免费电子书,囊括了Python的核心技术,以及Python的主要函数库的使用方法。读者可以在「 极客起源 」 公众号中输入  160442  开始学习,或点击「极客起源」公众号下方的「 编程思想 」 >  「 Python编程思想 」 菜单开始学习。

- ------ ----正文 -----------

在正式学习Python语言之前,我们先来了解一下Python有哪些特性,以及Python的基本语法结构是怎样的。

有很多同学问,Python语言到底能做什么呢?我的回答是:Python几乎什么都能做,包括移动、GUI、Web、数据分析,更是数据挖掘、机器学习、深度学习等技术的首选语言。

基于 Python 的包更是不胜枚举,“Tiobe 编程语言排行榜”最新统计显示 Python 是增长最快的语言。

Python编程思想(2):Python主要特性、命名规则与代码缩进

这得益于 Python 语言语法简单、开发效率高,集成系统非常方便。Python 相关的就业机会也是非常多,待遇也很优厚。因此,不管从易用性,还是工作机会和待遇来说,Python 都是 IT 从业者需要掌握的语言。

现在先让我来问大家一个问题,Python到底是怎样一种编程语言呢?

要回答这个问题,首先需要介绍一下Python的量大特性:动态语言和弱类型。

那么什么是动态语言呢?

要了解什么是动态语言,要首先了解“类型检查”。类型检查是验证类型约束的过程,编译器或解释器通常在编译阶段或运行阶段做类型检查。

类型检查就是查看“变量”和它们的”类型”,然后判断表达式是否合理。例如,不能拿一个 string 类型变量除以浮点数变量。

如果类型检查发生在程序运行阶段,那么它便是“动态类型语言”。常见的动态语言包括:

  • Python

  • JavaScrpit

  • PHP

类型检查发生在“编译阶段”的是“静态类型语言”。常见的静态类型语言包括:

  • C

  • C++

  • Java

  • Swift

  • Kotlin

  • C#

  • Scala

现在明白了吧,Python属于动态类型语言,也就是说,Python中的数据类型在编译时是不检查的,只有在运行时才会检查。这么做的好处是在定义变量时可以不事先指定数据类型,或者随便喂变量指定一个值,反正后期还可以变。但坏处也显而易见,尽管动态类型带来了遍历,但同时也带来了麻烦。由于变量的数据类型是不确定的,所以就会导致在任何时候,变量可能是任何的数据类型。这样就会造成一个问题。我们就无法准确的得到变量内部的成员。例如。变量的初始类型是一个类。如果编程语言是静态类型的,那么就意味着这个变量的类型永远不可能变,所以我们可以准确地得知这个变量所对应的这个类里面的成员,比如说这个类中有什么方法,有什么属性。但是如果这种语言是动态类型的。那么就意味着这个变量有可能会变成其他的数据类型,比如说,变量可能会变成int类型。如果是这样的话,我们就没有办法准确地得知这个变量所对应的类型中的成员。这也是为什么现在几乎所有的支持动态语言的IDE的用户体验都不如支持静态语言IDE的原因。

那么什么是弱类型语言和强类型语言呢?

如果用一句话定义,这句话就是: 变量的数据类型一旦被指定,就永远不会变化,这种语言就称为强类型语言。 反之。 如果变量的数据类型被指定,后期还可以改变这个变量的数据类型,那么这种语言就称为弱类型语言。

根据这个定义。Python很明显是一种弱类型语言,因为在任何时候都可以为Python变量赋任何类型的值。例如,

x = 20          # 整数类型

在上面的4行代码中,变量x改变了4次数据类型,首先为x赋值为20,在定义x变量的同时,将x变量的数据类型设置为整数类型,然后分别将x的数据类型设为字符串、浮点和布尔类型。 任何可以实现这种效果的编程语言都是弱类型语言。

这里可能会有如下两个误解:

1.  有很多编程语言,如Java、Swift、Dart等,都至少有一种数据类型,是所有数据类型的根,如Java中的Object、Swift中的Any、Dart中的dynamic,如果变量声明为这些数据类型,同样可以设置任何,从表面上看,与动态类型语言的效果类似,不过这些语言仍然是强类型语言,因为变量的类型并没有改变,只是变量的类型允许设置任何类型的值,因为这些数据类型是一切类型的根类型。

2. 有很多资料和书将Python说成是强类型语言,理由是不能与其他数据类型在计算表达式中混合使用。例如,在Python语言中有两个变量x和y,x是字符串类型,y是整数类型。x和y不能直接相加,而需要将x转换为整数类型,或者将y转换为字符串类型。其实这么理解是完全错误的,因为这是一个语义的规则。

我们不妨做个假设,假设一种编程语言如果是弱类型或强类型,那将永远是弱类型和强类型语言。如果这个假设成立,那么未来的Python版本有可能可以让x和y相加,只要规定数据类型的优先级即可,也就是说,如果两个完全不同的数据类型的值相加,以谁为主,这里姑且规定,String类型在所有内建数据(int、float、bool等)类型中的优先级最高,那么x + y,其实会自动将y转换为字符串,然后再和x连接。这种语言的改进完全有可能。

那可能有的同学会问,这么改进,不会让大量已经存在的Python程序出问题吗?如果只是这种改进,当然不会有任何问题。因为x + y只有如下3种可能:

1. 直接写成x + y,这种可能会导致程序出错,所以程序员会避免这种写法

2. 将y转换为字符串类型,这总情况与支持不同类型相加的Python版本的功能吻合,所以不会出现问题

3. 将x转换为整数,再与y相加,其实这就成了两个整数相加了,也不会有问题;

所以不管是哪种可能,都不会对原来的程序产生任何影响。如果Python的未来版本做了这种改变,那么就意味着Python就变成了一种弱类型变成。这与前面的假设相悖。

那么可能有的同学会问,难道Python的未来版本就不能对变量数据类型变化规则作出改变吗?也就是说,一旦变量的数据类型确定以后,就不能再改变。这么做,从技术上当然是没有问题。但这是一个编程语言的变化禁区。因为一旦这么变化,那么现存的Python程序真的会出问题。还是用上面的代码,这么变化的后果就意味着后3行代码将全部出错。所以对于编程语言的改进,并不是随意的,否则会造成很大的麻烦。因此,定义什么是弱类型或强类型语言,一定要在编程语言几乎不可能改变的特性上,如果变量数据类型的变化规则,这样才会符合前面的假设。当然,你可以假设编程语言的这个特性是随时可以变化的,例如,2012年的时候,是弱类型,在2016年,由于语言升级,所以变成了强类型语言。

现在可以总结一下:

常用的强类型编程语言如下:

  • C

  • C++

  • Java

  • C#

  • Swift

  • Kotlin

  • Dart

常用的弱类型编程语言如下:

  • Python

  • JavaScript

  • PHP

下面看一下Python不同于其他大多数编程语言的规则。

1. 命名规则

首先说明一点,命名规则并不是强制的,这只是约定,你可以不遵守,也可以指定团队自己使用的命名规则,但最好团队所有的成员使用同一的规则。下面列出的只是一种普通采用的规则,也是大多数Python程序库采用的规则。

标识符允许使用英文、数组和下划线,但不能以数字开头,这一点和其他编程语言相同;

Python是大小写敏感的编程语言,所以test和Test表示不同的含义;

变量名用小写形式,如value、test、hello等。如果变量名包含多个单词,那么中间用下划线分隔,如my_value、product_name等;

方法名与变量名的命名规则相同,如get_value(),set_my_value(...);

常量中所有的英文字母要大写,如果包含多个单词,中间用下划线分隔,如PI、PRODUCT_PRICE等;PS:在Python中并没有常量,但可以将变量当做常量使用;

类名采用大驼峰命名法,也就是每一个单词的首字母都要大写,如MyClass、Product、NewForum等;

如果类中的变量以单下划线(_)开头,如_value,是受保护变量,相当于Java中的protected,按官方描述是只能由本身或子类访问,但经过测试,外部也可以访问被声明为protected的变量,可能是Python解析器并没有做这样的限制;

如果类中的变量以双下划线(__)开头,如__value,是private类型的变量,只允许自身访问;

2. 缩进原则

这是Python与任何其他编程语言都不同的地方。其他的编程语言都是通过大括号来指定代码块的,而Python是通过缩进来指定代码块的。代码块的缩进可以任意,但同一个代码块中的每一行代码的缩进必须一致。

下面的代码定义了一个类Product,该类包括一个构造方法和一个普通方法,以及一个普通的类变量。后面的代码创建了Product对象,并调用了get_name方法。该例包含了类作用域和方法作用域,作用域以冒号(:)开头,后面作用域中的代码的缩进要一致,否则程序会报错。关于类的详细解释,会在后面的文章中详细讲解。

class Product:

其实我一开始学Python时,就感觉这个用缩进确定代码块的方式很别扭,因为一旦代码的缩进弄乱了,就很难调整回来,这不像用一对花括号,只要在花括号之间的肯定属于同一个作用域。 如果既然Python这么用了,就只能接受了。 据我所知,数百种编程语言,好像只有Python是这么做的。 不过由于Python的其他特性非常吸引人,所以这点小瑕疵并不影响Python的流行。

Python编程思想(2):Python主要特性、命名规则与代码缩进

本文分享自微信公众号 - 极客起源(geekculture)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这