同福

Python基本语法V1.5【20210121】

介绍

介绍

Python这种脚本语言福哥已经给大家介绍过了,现在童鞋们应该已经会安装python的开发环境了,接下来我们需要针对python语言进行一个系统的学习。

首先学习一门编程语言最先要学习的是语言的语法,学习编程语言的语法包括常量与变量、输入与输出、条件语句(if)、循环语句(for,while)、交换语句(switch,case)、函数(function)、对象(class),这个和之前福哥带着童鞋们接触c/c++、java、php三种主流编程语言的基本语法的顺序是一样的。不过学习过c/c++、java、php语言的老鸟会有一种感觉,就是python的语法真BT啊~~

V1.5版本增加了如下内容的教程:

  • 函数参数默认值的使用

  • 对象类型属性和数组类型属性的坑

  • 抛出异常语句的技巧

基本语法

  • 一行一个命令,不需要以“;”结尾

  • 逻辑语句使用4个空格缩进,使用逻辑语句的时候,例如:if、for、try等等,需要将子逻辑代码每一行都使用4个空格缩进一下

  • 行注释使用“#”,如果要为代码写注释信息或者取消一行代码的作用,需要使用“#”符号

  • 块注释是不支持的,python并不支持其他语言都支持的“/* ... */”块注释语法

常量与变量

变量定义

python属于弱类型的语言,所以python的变量是没有类型的

whoAmI = "同福"
howOldAmI = 35

类型转换

虽然python是弱类型,但是字符串和数字也是要区别对待的(这一点php就做的比较彻底,各种类型的变量可以随便混用)

strInt = "35"
realInt = int(strInt)

realInt = 35
strInt = str(realInt)

null

在python里是没有null的,取而代之是None,当函数处理异常时候一般情况下得到的都是None。判断None需要使用is关键字而不是“==”运算符

输入与输出

输入

python2输入不能使用input()了,需要引入sys软件包,使用sys.stdin对象

import sys

print ("你叫什么?")
yourName = sys.stdin.readline().strip()
print ("你多大了?")
howOldAreYou = sys.stdin.readline().strip()

print ("你是" + yourName + ",你今年" + howOldAreYou + "岁")

22020d4af039460d.jpg

输出

python输出语句使用 print 命令

whoAmI = "同福"
howOldAmI = 35 #sdf

print ("我叫" + whoAmI + ",我今年" + str(howOldAmI) + "岁")

ab2d1109fb108241.jpg

条件语句(if)

python的条件语句还是使用if,这时候就需要“缩进”了

python的else if换成了elif,这个和linux下的shell语言是一样的

whoAmI = "同福"
howOldAmI = 35
if whoAmI is not None and whoAmI != "":
    print whoAmI
if howOldAmI is not None and howOldAmI == 35:
    print howOldAmI
    
if howOldAmI == 12:
    print "好年轻啊!"
elif howOldAmI == 25:
    print "好帅啊!"
else:
    print "你到底多大啊?"

循环语句(for,while)

按次循环

python的按次循环很奇怪,需要通过range实现

howOldAmI = 0
for i in range(0, 35):
    howOldAmI = howOldAmI + 1
print howOldAmI

条件循环

python的条件循环基本和其他语言相似

howOldAmI = 0
i = 0
while i < 35:
    howOldAmI = howOldAmI + 1
    i = i + 1
print howOldAmI

交换语句(switch,case)

python没有switch语法,只能使用if、elif、else实现了

函数(function)

函数定义使用def关键字

无返回值

无返回值的函数定义

def showInfo():
    print "同福"
    print 35

showInfo()

有返回值

有返回值的函数定义,返回值使用return关键字返回出来

def getName():
    
    return "同福"

def getAge():

    return 35;

print ("我叫" + getName() + ",我今年" + str(getAge()) + "岁")

有参数

有参数的函数定义

def showInfo(name, age):
    print ("我叫" + name + ",我今年" + str(age) + "岁")

showInfo("同福", 35)

有默认值参数

函数参数可以指定默认值,有默认值的参数在调用的时候可以不传值进来

def showInfo(name, age=35):
    print ("我叫" + name + ",我今年" + str(age) + "岁")

showInfo("同福")

需要注意的是,如果一个参数设置了默认值,其后面的参数也都必须设置默认值,否则会报错

def showInfo(name, age=35, city):
    print ("我叫" + name + ",我今年" + str(age) + "岁,我住在" + city)

showInfo("同福", "北京")

参数定向传值

Python有个很NB的设计,如果函数有多个参数设置了默认值,可以通过指定设置了默认值的参数的名称来直接对其传值,即使它前面还有其他设置了默认值的参数

def showInfo(name, age=35, city="未知"):
    print ("我叫" + name + ",我今年" + str(age) + "岁,我住在" + city)

showInfo("同福", city="北京")

对象(class)

python的对象定义语法逆天了简直

基本语法

咱们看一个例子先

class fuge:
    name = "同福"
    age = 35

    def setName(self, name):
        self.name = name
    
    def setAge(self, age):
        self.age = age
    
    def showInfo(self, num):
        print ("[" + str(num) + "] 我叫" + self.name + ",我今年" + str(self.age) + "岁")
    
    def callShowInfo(self):
        self.showInfo(6)


myFuge = fuge()
myFuge2 = fuge();
myFuge.showInfo(1)
myFuge2.setName("福哥")
myFuge2.setAge(36)
myFuge.showInfo(2)
myFuge2.showInfo(3)
myFuge.callShowInfo()

2207e8d3e81f3609.jpg大家可以和福哥一块儿看看python的对象编程有多么另类

  • 对象声明使用class(这还是比较正规的)

  • 属性声明没有修饰符(这也还能接受)

  • 方法声明使用def(把它想成function就好)

  • 每个方法必须有参数,且第一个参数为指向对象自身的指针(我去这是什么鬼!?)

  • 方法内调用属性使用对象指针(这个...好吧,真能糊弄啊~)

  • 方法内调用其他方法使用对象指针,且不能传递对象指针参数(福哥已经无语了!!)

对象属性和数组属性的坑

python的对象属性真的是坑你没商量,请看下面的例子和输出结果

class webDev:
    languages={}

    def add(self, language):
        self.languages[language] = language

    def dump(self, num):
        print ("[" + str(num) + "]")
        for d in self.languages:
            print ("[" + d +"] " + self.languages[d])

web1 = webDev()
web1.add("PHP")

web2 = webDev()
web2.add("Java")

web1.dump(1)
web2.dump(2)

c93c048f3697d260.jpg

我勒个去,两个对象实例的languages属性串了,这是什么鬼啊???

如果对象属性是对象类型或者数组类型,那么这个属性相对于每一个实例都是共享的

这实在是太变态了,希望官方把它当作bug处理一下吧~~

下面福哥给出一个变通的办法,可以避免这种bug的出现。

如果我们要使用对象类型的属性或者数组类型的属性,可以在构造器里面进行初始化

class webDev:
    languages={}
    
    def __init__(self):
        self.languages={}

    def add(self, language):
        self.languages[language] = language

    def dump(self, num):
        print ("[" + str(num) + "]")
        for d in self.languages:
            print ("[" + d +"] " + self.languages[d])

web1 = webDev()
web1.add("PHP")

web2 = webDev()
web2.add("Java")

web1.dump(1)
web2.dump(2)

69e437da05fc8a19.jpg

捕获异常语句(try)

很多时候我们所期望的情况和实际的情况是有差距的,这个时候会出现意想不到的情况,这种情况我们称之为异常情况(exception),一般情况下,遇到这种情况程序会终止执行,这不是我们所希望的

为了解决这个问题,我们可以使用try语句去尝试执行我们的程序代码,如果出现了异常我们可以主动设计程序的处理方案,避免程序终止执行

try:
    print (fuge + ",是你吗?")
except Exception as e:
    print e
finally:
    print "哦,我知道了"

解释一下

  • try:这部分代码是主逻辑,python会尝试运行这段代码

  • except:如果主逻辑执行出现异常情况会将异常信息捕获起来放入变量e,并执行用户的处理方案

  • finally(可选):无论主逻辑执行是否出现异常情况,这段代码都会被执行,这段是可选的

抛出异常语句(raise)

一些情况下,我们的程序无法继续处理,这时候就需要告知上一层的程序代码程序运行遇到了问题。这种情况下,我们可以使用raise语句主动抛出一个异常状态出来,交给上一层的程序代码去处理

上一层程序代码也就是调用当前函数的程序代码,它接收到我们抛出来的异常可以通过try进行捕获,也可以不管这个异常,那么python解析器就会把这个异常显示给执行脚本的人看了

def showInfo(name, age):
    if age == 0:

        raise Exception("没有人的岁数是 0 岁好吗?")
    
    print ("我叫" + name + ",我今年" + str(age) + "岁")

showInfo("同福", 0)

fb6a2ba782760643.jpg

引用自定义包

我们编程python程序时候,在将公共处理封装到函数里面或者对象里面,这样业务逻辑代码会看起来非常清爽。如果一些函数或者对象是属于公共的,多处都需要使用这些函数或者对象,那么应该怎么办呢?

我们可以将一些函数或者对象放到一个py文件里,在需要调用这些函数或者对象的py文件里面引用它们

同级目录

如果引入的自定义(package)的py文件和调用(main)的py文件在同一级目录下,可以直接引入这个自定义(package)的py文件

结构

package.py
main.py

main.py

from package import *

不同级目录

如果引入的自定义(package)的py文件在调用(main)的py文件不在同一级目录下,需要在自定义(package)的py文件所在目录建立空文件__init__.py文件

结构

lib/__init__.py
lib/package.py
main.py

main.py

from lib.package import *

总结

python的语法很奇怪,与常规的编程语言的语法格式区别很大,但是就没有学会编程的人首次接触python的时候,他们的反馈是:感觉很容易理解。不得不说,这一点真的是始料不及的,这个python语言的语法确实值得我们这些古董级的程序员反思一下。

福哥尝试着用最容易理解的方式给童鞋们讲解各种编程语言的语法和开发技巧,希望童鞋们可以认真学习。如果遇到了问题,可以将真实的感受反馈给福哥,福哥会想办法以更加好理解的方式讲解给大家~~