跳转至

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍Python环境配置与基础语法。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

😏1. python介绍

Python是一种高级编程语言,由Guido van Rossum于1991年创建。它被设计成易读、简洁、可扩展的语言,具有强大的功能和广泛的应用领域。

以下是Python的一些重要特点:

1.简单易学:Python使用清晰简洁的语法,易于阅读和理解,适合初学者入门。它的设计哲学强调代码的可读性和明确性。

2.开源和跨平台:Python是开源的,可以免费使用和分发。它支持在多个操作系统上运行,包括Windows、macOS和各种Linux发行版。

3.大量的库和框架:Python拥有庞大而活跃的社区,提供了丰富的第三方库和框架,使开发人员能够快速构建各种应用程序,例如科学计算、数据分析、Web开发、人工智能等。

4.面向对象编程:Python支持面向对象编程(OOP),允许开发人员使用类、对象、继承和多态等概念来组织和管理代码。

5.动态类型和自动内存管理:Python是一种动态类型语言,不需要显式地声明变量类型,这使得代码编写更加灵活。此外,Python还具有自动内存管理机制,开发人员不需要手动处理内存分配和释放。

6.多用途:Python可用于各种任务,包括脚本编写、快速原型开发、图像处理、网络编程、游戏开发等。它还是许多流行软件工具和框架的首选语言,如Django、Flask、NumPy和Pandas等。

综上,Python因其简洁性、可读性和功能强大而受到广泛的欢迎。无论你是初学者还是经验丰富的开发人员,Python都是一个值得学习和掌握的优秀编程语言。

😊2. 环境安装与配置

Windows安装python

首先在官网下载安装包:https://www.python.org/downloads/windows/

在这里插入图片描述

这里我选择3.7.1下载安装(默认或自定义安装)。

然后打开cmd命令行输入python,即可进入交互环境,并查看版本python -V

更换国内源:

# 在用户下创建pip文件夹并创建pip.ini文件
[global]
index-url = http://pypi.douban.com/simple/
# index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = pypi.douban.com
# trusted-host = https://pypi.tuna.tsinghua.edu.cn

Ubuntu安装python

ubuntu默认安装了python,ubuntu18默认是python2,ubuntu20之后默认是python3

如果需要安装指定的python3版本,以下:

# 安装指定版本python
wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz
tar -zxvf Python-3.7.1.tgz
cd Python-3.7.1
./configure
# 或者
./configure --prefix=/usr/local/python3.7.1
make
make test
sudo make install

# 更换默认python版本
sudo mv /usr/bin/python /usr/bin/python.bak
sudo ln -s /usr/local/python3.7.1/bin/python3.7 /usr/bin/python
sudo mv /usr/bin/pip /usr/bin/pip.bak
sudo ln -s /usr/local/python3.7.1/bin/pip3 /usr/bin/pip

python安装扩展包非常方便,可以通过pip install xxx指令安装,如:

pip install numpy

miniconda安装

为了便于对python环境及pip包做管理,可以安装anaconda,但它也有缺点(运行卡顿等),因此可选择miniconda,可方便创建多个版本的python环境。

miniconda安装:

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
sudo chmod +x Miniconda3-latest-Linux-x86_64.sh
sudo ./Miniconda3-latest-Linux-x86_64.sh
/opt/miniconda3 # 选择安装目录
# 打开~/.bashrc文件,在文件末尾加入如下内容
export PATH="/opt/miniconda3/bin:$PATH"

conda使用:

conda install python=3.7
conda create -n <my_environment> python=3.7 # 创建指定名字的环境
# 若出错,是因为权限问题 sudo chmod a+w .conda
conda activate <my_environment> # 生效环境
conda env list  # 查看环境列表
conda env remove --name <my_environment> --all  # 删除环境

Python作为一种语言,与英语一样,要多用才能更熟练。在做项目、解决问题的过程中会自然而然地熟悉和进步。

😆3. python基础语法

python是解释型语言,因此程序不需要编译可以直接运行,在终端运行python程序可以直接python xxx.py,如:

python main.py

为了编写和运行方便,可以安装VSCodePycharm这种IDE,有了插件的加持编写代码更加方便。

第一个python程序

#!/usr/bin/python3

print("Hello, World!")

语法基础

Python标识符也是要以字母或下划线开头,且对大小写敏感。如value setValue ClassExample

关键字(保留字)不能用于标识符的名称。查看python中的所有关键字,可以用标准库的keyword模块:

import keyword
print(keyword.kwlist)

Python中单行注释以#开头,多行注释可以用多个#号,或者三引号'''"""

# 单行注释

'''
多行注释1
多行注释2
多行注释3
'''

"""
多行注释4
多行注释5
多行注释6
"""

Python与C++一个大的差异是,python用缩进来控制代码块,而不是{}

if True:
    print ("now is True")
else:
    print ("now is False")

Python语句末尾不需要分号,但需要在一行显示多条语句时,用分号;隔开。

import 或者 from...import 来导入相应的模块。如

import xxx # 导入整个模块
from xxx import xxx # 导入模块的某个函数
from xxx import xxx, xxx # 导入模块的多个函数
from xxx import \* # 导入模块的所有函数

数据类型

Python中数字有3种类型,即整数int、浮点数float和复数complex

字符串string可以用单引号或双引号表示,且没有单独的字符类型,一个字符就是长度为1的字符串。转义符\可以用来转义,如\n,但在string前加上r可以使其不转义,输出本身的值。

str = '123456789'
print(str + r"hello\nworld")

此外,还有布尔型bool、列表list、元组tuple(不可变)、集合set、字典dictionary

# list
my_list = [1, 2, 3, "apple", "banana"]

print(my_list[0])  # 输出:1
print(my_list[3])  # 输出:"apple"

my_list.append("orange")  # 添加元素
print(my_list)  # 输出:[1, 2, 3, "apple", "banana", "orange"]

my_list.remove(2)  # 移除元素
print(my_list)  # 输出:[1, 3, "apple", "banana", "orange"]

# tuple(不可变)
my_tuple = (1, 2, 3, "apple", "banana")

print(my_tuple[0])  # 输出:1
print(my_tuple[3])  # 输出:"apple"

Python的数据类型间的转换,可以直接将数据类型作为函数名即可。如float(x)

控制流语句

number = 7
guess = -1
print("猜数字游戏!")

# while循环
while guess != number:
    guess = int(input("请输入你猜的数字:")) # input输入
    # if else条件
    if guess == number:
        print("恭喜,你猜对了!")
    elif guess < number:
        print("猜的数字小了...")
    elif guess > number:
        print("猜的数字大了...")
# for循环
# list
sites = ["Baidu", "Google", "Yandex"]
for site in sites:
    print(site)
# string
word = 'python'
for letter in word:
    print(letter)
# number
for number in range(1, 8):
    print(number)

函数

# 最大值函数
def max(a, b):
    if a > b:
        return a
    else:
        return b

a = 9
b = 5
print(max(a, b))

文件操作

import os

def writeFile():
    # 创建文件
    file = open("example.txt", "w")
    # 写入文件内容
    file.write("This is a new file.")
    # 追加写入文件内容
    file.write("\nThis is a new line 2.")
    # 关闭文件
    file.close()

def readFile():
    # 创建文件
    file = open("example.txt", "r")
    # 读取文件内容
    content = file.read()
    print(content)
    # 关闭文件
    file.close()

def removeFile():
    # 删除文件
    if os.path.exists("example.txt"):
        os.remove("example.txt")
    else:
        print("The file does not exist.")

removeFile()
writeFile()
readFile()

模块

import sys

print('命令行参数如下:')
for i in sys.argv:
    print(i)

print('Python 路径为:', sys.path, '\n')

# 类定义
class people:
    # 定义基本属性
    name = ''
    age = 0
    # 定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0

    # 定义构造方法(初始化)
    def \_\_init\_\_(self, n, a, w):
        self.name = n
        self.age = a
        self.__weight = w

    def speak(self):
        print("%s 说: 我 %d 岁, %d kg。" % (self.name, self.age, self.__weight))


# 实例化类
p = people('XiaoMing', 18, 60)
p.speak()

在这里插入图片描述

以上。

Python学习笔记

一、Python介绍

简介

Python 是一种解释型、交互型、面向对象、动态数据类型的、适合初学者的高级程序设计语言。
Python 2.7 被确定为最后一个 Python 2.x 版本。
Python 3.x 不向下兼容。
以下都是基于Python 3 。

过往

Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的。  
Python 本身也是由诸多其他语言发展而来的,这包括 ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unix shell 和其他的脚本语言等等。    
像 Perl 语言一样,Python 源代码同样遵循 GPL(GNU General Public License)协议。

特点

1.易于学习Python有相对较少的关键字结构简单和一个明确定义的语法学习起来更加简单

2.易于阅读Python代码定义的更清晰

3.易于维护Python的成功在于它的源代码是相当容易维护的

4.一个广泛的标准库Python的最大的优势之一是丰富的库跨平台的在UNIXWindows和Macintosh兼容很好

5.互动模式互动模式的支持您可以从终端输入执行代码并获得结果的语言互动的测试和调试代码片断

6.可移植基于其开放源代码的特性Python已经被移植也就是使其工作到许多平台

7.可扩展如果你需要一段运行很快的关键代码或者是想要编写一些不愿开放的算法你可以使用C或C++完成那部分程序然后从你的Python程序中调用

8.数据库Python提供所有主要的商业数据库的接口

9.GUI编程Python支持GUI可以创建和移植到许多系统调用

10.可嵌入: 你可以将Python嵌入到C/C++程序让你的程序的用户获得"脚本化"的能力

Python应用

  • 豆瓣网 - 图书、唱片、电影等文化产品的资料数据库网站
  • 知乎 - 一个问答网站
  • Blender - 使用Python作为建模工具与GUI语言的开源3D绘图软件

二、环境搭建

以下基于Linux平台,其他平台请自查:
Python3安装:sudo apt-get install python3
查看版本:

python3 -V
或
python3 --version

三、第一个Python程序

编辑程序:

#!/usr/bin/python3
print("Hello, World!")

执行程序:
python3 hello.py

四、Python常用语法实践

编码

默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。
# -*- coding: utf-8 -*-

标识符

第一个字符必须是字母表中字母或下划线 _ 。
标识符的其他的部分由字母、数字和下划线组成。
标识符对大小写敏感。

在 Python 3 中,可以用中文作为变量名,非 ASCII 标识符也是允许的了。

保留字

保留字即关键字,我们不能把它们用作任何标识符名称。Python 的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字:

>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

注释

单行注释以 # 开头
多行注释可以用多个 # 号,还有 ''' 和 """

行与缩进

python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {} ,但若缩进错误会导致程序出错。
if True:
    print ("True")
else:
    print ("False")

多行语句

Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠 \ 来实现多行语句。

total = item_one + \
        item_two + \
        item_three

在 [], {}, 或 () 中的多行语句,不需要使用反斜杠 \。

total = ['item_one', 'item_two', 'item_three',
        'item_four', 'item_five']

数字类型(Number)

python中数字有四种类型:整数、布尔型、浮点数和复数。

int (整数), 如 1, 只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
bool (布尔), 如 True。
float (浮点数), 如 1.23、3E-2
complex (复数), 如 1 + 2j、 1.1 + 2.2j

字符串(String)

Python 中单引号 ' 和双引号 " 使用完全相同。
使用三引号(''' 或 """)可以指定一个多行字符串。
转义符 \。
反斜杠可以用来转义,使用 r 可以让反斜杠不发生转义。 如 r"this is a line with \n" 则 \n 会显示,并不是换行。
按字面意义级联字符串,如 "this " "is " "string" 会被自动转换为 this is string。
字符串可以用 + 运算符连接在一起,用 * 运算符重复。
Python 中的字符串有两种索引方式,从左往右以 0 开始,从右往左以 -1 开始。
Python 中的字符串不能改变。
Python 没有单独的字符类型,一个字符就是长度为 1 的字符串。
字符串的截取的语法格式如下:变量[头下标:尾下标:步长]
#!/usr/bin/python3
word = '字符串'
sentence = "这是一个句子。"
paragraph = """这是一个段落,
可以由多行组成"""

str='123456789'

print(str)                 # 输出字符串
print(str[0:-1])           # 输出第一个到倒数第二个的所有字符
print(str[0])              # 输出字符串第一个字符
print(str[2:5])            # 输出从第三个开始到第五个的字符
print(str[2:])             # 输出从第三个开始后的所有字符
print(str[1:5:2])          # 输出从第二个开始到第五个且每隔一个的字符(步长为2)
print(str * 2)             # 输出字符串两次
print(str + '你好')         # 连接字符串
print('------------------------------')
print('hello\nrunoob')      # 使用反斜杠(\)+n转义特殊字符
print(r'hello\nrunoob')     # 在字符串前面添加一个 r,表示原始字符串,不会发生转义

空行

函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。

空行与代码缩进不同,空行并不是 Python 语法的一部分。书写时不插入空行,Python 解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。

记住:空行也是程序代码的一部分。

import 与 from…import

在 python 用 import 或者 from…import 来导入相应的模块。
将整个模块(somemodule)导入,格式为: import somemodule
从某个模块中导入某个函数,格式为: from somemodule import somefunction
从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc
将某个模块中的全部函数导入,格式为: from somemodule import *

#!/usr/bin/python3
# 查询命令行参数和路径
import sys
print('================Python import mode==========================')
print ('命令行参数为:')
for i in sys.argv:
    print (i)
print ('\n python 路径为',sys.path)

Python运算符

算术运算符

#!/usr/bin/python3

a = 21
b = 10
c = 0

c = a + b
print ("1 - c 的值为:", c)

c = a - b
print ("2 - c 的值为:", c)

c = a * b
print ("3 - c 的值为:", c)

c = a / b
print ("4 - c 的值为:", c)

c = a % b
print ("5 - c 的值为:", c)

# 修改变量 a 、b 、c
a = 2
b = 3
c = a**b 
print ("6 - c 的值为:", c)

a = 10
b = 5
c = a//b 
print ("7 - c 的值为:", c)

比较运算符

#!/usr/bin/python3

a = 21
b = 10
c = 0

if ( a == b ):
   print ("1 - a 等于 b")
else:
   print ("1 - a 不等于 b")

if ( a != b ):
   print ("2 - a 不等于 b")
else:
   print ("2 - a 等于 b")

if ( a < b ):
   print ("3 - a 小于 b")
else:
   print ("3 - a 大于等于 b")

if ( a > b ):
   print ("4 - a 大于 b")
else:
   print ("4 - a 小于等于 b")

# 修改变量 a 和 b 的值
a = 5
b = 20
if ( a <= b ):
   print ("5 - a 小于等于 b")
else:
   print ("5 - a 大于  b")

if ( b >= a ):
   print ("6 - b 大于等于 a")
else:
   print ("6 - b 小于 a")

赋值运算符

#!/usr/bin/python3

a = 21
b = 10
c = 0

c = a + b
print ("1 - c 的值为:", c)

c += a
print ("2 - c 的值为:", c)

c *= a
print ("3 - c 的值为:", c)

c /= a 
print ("4 - c 的值为:", c)

c = 2
c %= a
print ("5 - c 的值为:", c)

c **= a
print ("6 - c 的值为:", c)

c //= a
print ("7 - c 的值为:", c)

位运算

#!/usr/bin/python3

a = 60            # 60 = 0011 1100 
b = 13            # 13 = 0000 1101 
c = 0

c = a & b        # 12 = 0000 1100
print ("1 - c 的值为:", c)

c = a | b        # 61 = 0011 1101 
print ("2 - c 的值为:", c)

c = a ^ b        # 49 = 0011 0001
print ("3 - c 的值为:", c)

c = ~a           # -61 = 1100 0011
print ("4 - c 的值为:", c)

c = a << 2       # 240 = 1111 0000
print ("5 - c 的值为:", c)

c = a >> 2       # 15 = 0000 1111
print ("6 - c 的值为:", c)

逻辑运算符

#!/usr/bin/python3

a = 10
b = 20

if ( a and b ):
   print ("1 - 变量 a 和 b 都为 true")
else:
   print ("1 - 变量 a 和 b 有一个不为 true")

if ( a or b ):
   print ("2 - 变量 a 和 b 都为 true,或其中一个变量为 true")
else:
   print ("2 - 变量 a 和 b 都不为 true")

# 修改变量 a 的值
a = 0
if ( a and b ):
   print ("3 - 变量 a 和 b 都为 true")
else:
   print ("3 - 变量 a 和 b 有一个不为 true")

if ( a or b ):
   print ("4 - 变量 a 和 b 都为 true,或其中一个变量为 true")
else:
   print ("4 - 变量 a 和 b 都不为 true")

if not( a and b ):
   print ("5 - 变量 a 和 b 都为 false,或其中一个变量为 false")
else:
   print ("5 - 变量 a 和 b 都为 true")

成员运算符

#!/usr/bin/python3

a = 10
b = 20
list = [1, 2, 3, 4, 5 ]

if ( a in list ):
   print ("1 - 变量 a 在给定的列表中 list 中")
else:
   print ("1 - 变量 a 不在给定的列表中 list 中")

if ( b not in list ):
   print ("2 - 变量 b 不在给定的列表中 list 中")
else:
   print ("2 - 变量 b 在给定的列表中 list 中")

# 修改变量 a 的值
a = 2
if ( a in list ):
   print ("3 - 变量 a 在给定的列表中 list 中")
else:
   print ("3 - 变量 a 不在给定的列表中 list 中")

身份运算符

#!/usr/bin/python3
# 注: id() 函数用于获取对象内存地址。
a = 20
b = 20

if ( a is b ):
   print ("1 - a 和 b 有相同的标识")
else:
   print ("1 - a 和 b 没有相同的标识")

if ( id(a) == id(b) ):
   print ("2 - a 和 b 有相同的标识")
else:
   print ("2 - a 和 b 没有相同的标识")

# 修改变量 b 的值
b = 30
if ( a is b ):
   print ("3 - a 和 b 有相同的标识")
else:
   print ("3 - a 和 b 没有相同的标识")

if ( a is not b ):
   print ("4 - a 和 b 没有相同的标识")
else:
   print ("4 - a 和 b 有相同的标识")
# is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。

Python流程控制

if

#!/usr/bin/python3
var1 = 100
if var1:
    print ("1 - if 表达式条件为 true")
    print (var1)

var2 = 0
if var2:
    print ("2 - if 表达式条件为 true")
    print (var2)
print ("Good bye!")

if-elif

#!/usr/bin/python3
age = int(input("请输入你家狗狗的年龄: "))
print("")
if age <= 0:
    print("你是在逗我吧!")
elif age == 1:
    print("相当于 14 岁的人。")
elif age == 2:
    print("相当于 22 岁的人。")
elif age > 2:
    human = 22 + (age -2)*5
    print("对应人类年龄: ", human)

### 退出提示
input("点击 enter 键退出")

if嵌套

#!/usr/bin/python3
num=int(input("输入一个数字:"))
if num%2==0:
    if num%3==0:
        print ("你输入的数字可以整除 2 和 3")
    else:
        print ("你输入的数字可以整除 2,但不能整除 3")
else:
    if num%3==0:
        print ("你输入的数字可以整除 3,但不能整除 2")
    else:
        print  ("你输入的数字不能整除 2 和 3")

while

#!/usr/bin/python3
# 计算0-100的和
n = 100

sum = 0
counter = 1
while counter <= n:
    sum = sum + counter
    counter += 1

print("1 到 %d 之和为: %d" % (n,sum))

while-else

#!/usr/bin/python3

count = 0
while count < 5:
   print (count, " 小于 5")
   count = count + 1
else:
   print (count, " 大于或等于 5")

while无限循环

#!/usr/bin/python3
# 当要循环的语句很简单时,可以写在同一行
flag = 1

while (flag): print ('欢迎访问菜鸟教程!')

print ("Good bye!")

for

#!/usr/bin/python3

sites = ["Baidu", "Google","Runoob","Taobao"]
for site in sites:
    if site == "Runoob":
        print("菜鸟教程!")
        break
    print("循环数据 " + site)
else:
    print("没有循环数据!")
print("完成循环!")
# break 语句可以跳出 for 和 while 的循环体。如果你从 for 或 while 循环中终止,任何对应的循环 else 块将不执行。
# continue 语句被用来告诉 Python 跳过当前循环块中的剩余语句,然后继续进行下一轮循环。 

Python函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

函数定义

#!/usr/bin/python3
'''
def 函数名(参数列表):
    函数体
'''
def hello() :
    print("Hello World!")

hello()

return语句

#!/usr/bin/python3
# 可写函数说明
def sum( arg1, arg2 ):
   # 返回2个参数的和."
   total = arg1 + arg2
   print ("函数内 : ", total)
   return total

# 调用sum函数
total = sum( 10, 20 )
print ("函数外 : ", total)

Python面向对象

Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。

类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
方法:类中定义的函数。
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
局部变量:定义在方法中的变量,只作用于当前实例的类。
实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
实例化:创建一个类的实例,类的具体对象。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

类定义

#!/usr/bin/python3

class MyClass:
    """一个简单的类实例"""
    i = 12345
    def f(self):
        return 'hello world'

# 实例化类
x = MyClass()

# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.i)
print("MyClass 类的方法 f 输出为:", x.f())
# 类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用
# self代表类的实例,而非类

类的方法

#!/usr/bin/python3

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))

# 实例化类
p = people('runoob',10,30)
p.speak()

继承

Python 同样支持类的继承,如果一种语言不支持继承,类就没有什么意义。

#!/usr/bin/python3

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))

#单继承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))



s = student('ken',10,60,3)
s.speak()

命名空间/作用域

一般有三种命名空间:

内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)
#!/usr/bin/python3

total = 0 # 这是一个全局变量
# 可写函数说明
def sum( arg1, arg2 ):
    #返回2个参数的和."
    total = arg1 + arg2 # total在这里是局部变量.
    print ("函数内是局部变量 : ", total)
    return total

#调用sum函数
sum( 10, 20 )
print ("函数外是全局变量 : ", total)

五、Python标准库

操作系统接口

os模块提供了不少与操作系统相关联的函数,因此能和shell配合做一些自动化测试程序!

import os
os.getcwd()      # 返回当前的工作目录
os.chdir('/server/accesslogs')   # 修改当前的工作目录
os.system('mkdir today')   # 执行系统命令 mkdir 

文件通配符

glob模块提供了一个函数用于从目录通配符搜索中生成文件列表

import glob
glob.glob('*.py')

命令行参数

通用工具脚本经常调用命令行参数。这些命令行参数以链表形式存储于 sys 模块的 argv 变量。

import sys
print(sys.argv)

错误输出重定向和程序终止

sys.stderr.write('Warning, log file not found starting a new one\n')

sys 还有 stdin,stdout 和 stderr 属性,即使在 stdout 被重定向时,后者也可以用于显示警告和错误信息。
大多脚本的定向终止都使用 “sys.exit()”。

数学

math模块为浮点运算提供了对底层C函数库的访问:

import math
math.cos(math.pi / 4)

random提供了生成随机数的工具。

import random
random.choice(['apple', 'pear', 'banana'])

日期和时间

datetime模块为日期和时间处理同时提供了简单和复杂的方法。

支持日期和时间算法的同时,实现的重点放在更有效的处理和格式化输出。

该模块还支持时区处理:

#!/usr/bin/python3

from datetime import date
now = date.today()
now
print(now)

2to3工具-自动将 Python 2 代码转为 Python 3 代码

工具安装:sudo apt install 2to3

测试:这里有一个 Python 2.x 的源码文件,example.py

def greet(name):
    print "Hello, {0}!".format(name)
print "What's your name?"
name = raw_input()
greet(name)

最常用的命令是加上-w参数,2to3 -w example.py,最后生成:

def greet(name):
    print("Hello, {0}!".format(name))
print("What's your name?")
name = input()
greet(name)

注释和缩进都会在转换过程中保持不变。

官方参考文档:2to3

六、Python应用案例

网络编程

Python 提供了两个级别访问的网络服务。:

低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法。
高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。

什么是 Socket?

Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

socket()函数

Python 中,我们用 socket() 函数来创建套接字,语法格式如下:
socket.socket([family[, type[, proto]]])

family: 套接字家族可以是 AF_UNIX 或者 AF_INET
type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
protocol: 一般不填默认为0.

服务端实例

#!/usr/bin/python3
# 我们使用 socket 模块的 socket 函数来创建一个 socket 对象。socket 对象可以通过调用其他函数来设置一个 socket 服务。

# 现在我们可以通过调用 bind(hostname, port) 函数来指定服务的 port(端口)。

# 接着,我们调用 socket 对象的 accept 方法。该方法等待客户端的连接,并返回 connection 对象,表示已连接到客户端。
# 导入 socket、sys 模块
import socket
import sys

# 创建 socket 对象
serversocket = socket.socket(
            socket.AF_INET, socket.SOCK_STREAM)

# 获取本地主机名
host = socket.gethostname()
print(host)

port = 9999

# 绑定端口号
serversocket.bind((host, port))

# 设置最大连接数,超过后排队
serversocket.listen(5)

while True:
    # 建立客户端连接
    clientsocket,addr = serversocket.accept()      

    print("连接地址: %s" % str(addr))

    msg='欢迎访问菜鸟教程!'+ "\r\n"
    clientsocket.send(msg.encode('utf-8'))
    clientsocket.close()

客户端实例

#!/usr/bin/python3

# 接下来我们写一个简单的客户端实例连接到以上创建的服务。端口号为 9999。

# socket.connect(hostname, port ) 方法打开一个 TCP 连接到主机为 hostname 端口为 port 的服务商。连接后我们就可以从服务端获取数据,记住,操作完成后需要关闭连接。

# 导入 socket、sys 模块
import socket
import sys

# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取本地主机名
host = socket.gethostname()

# 设置端口号
port = 9999

# 连接服务,指定主机和端口
s.connect((host, port))

# 接收小于 1024 字节的数据
msg = s.recv(1024)

s.close()

print (msg.decode('utf-8'))

Python多线程

Python日期和时间

Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。

每个时间戳都以自从 1970 年 1 月 1 日午夜(历元)经过了多长时间来表示。

Python 的 time 模块下有很多函数可以转换常见日期格式。如函数 time.time() 用于获取当前时间戳, 如下实例:

import time  # 引入time模块

ticks = time.time()
print ("当前时间戳为:", ticks)

Python内置函数

参考

Python pip

pip 是 Python 包管理工具,该工具提供了对 Python 包的查找、下载、安装、卸载的功能。

软件包也可以在 https://pypi.org/ 中找到。

目前最新的 Python 版本已经预装了 pip。

pip --version   # 版本
pip install some-package-name   # 安装包
pip uninstall some-package-name # 移除包
pip list    # 查看包

七、数据结构与算法(Python)

二分查找(递归)

#!/usr/bin/python3

# 返回 x 在 arr 中的索引,如果不存在返回 -1
def binarySearch (arr, l, r, x): 

    # 基本判断
    if r >= l: 

        mid = int(l + (r - l)/2)

        # 元素整好的中间位置
        if arr[mid] == x: 
            return mid 

        # 元素小于中间位置的元素,只需要再比较左边的元素
        elif arr[mid] > x: 
            return binarySearch(arr, l, mid-1, x) 

        # 元素大于中间位置的元素,只需要再比较右边的元素
        else: 
            return binarySearch(arr, mid+1, r, x) 

    else: 
        # 不存在
        return -1

# 测试数组
arr = [ 2, 3, 4, 10, 40 ] 
x = 10

# 函数调用
result = binarySearch(arr, 0, len(arr)-1, x) 

if result != -1: 
    print ("元素在数组中的索引为 %d" % result )
else: 
    print ("元素不在数组中")