Python语法

文章目录

  • 一、Python基础
    • 1. 数据类型和变量
    • 2. 字符串和编码
      • 字符编码
      • Python的字符串
      • 格式化
    • 3. list和tuple
      • list
      • tuple
    • 4.条件判断
    • 5. 模式匹配
    • 6. 循环
    • 7. dict 和 set
      • dict
      • set
  • 二、函数
    • 1. 调用函数
    • 2. 定义函数
    • 3. 函数的参数
    • 4. 递归函数
  • 三、高级特性
  • 四、函数式编程
    • 1. 高阶函数
    • 2. 返回函数
    • 3. 匿名函数
    • 4. 装饰器
    • 5. 偏函数
  • 五、模块
    • 模块定义
    • 使用模块
    • 安装第三方模块
    • 安装常用模块
    • 模块搜索路径

一、Python基础

1. 数据类型和变量

数据类型:整数、浮点数、字符串、布尔值、空值(None)
变量:变量名必须是大小写英文、数字和_的组合,且不能用数字开头
常量:常量就是不能变的变量,在Python中,通常用全部大写的变量名表示常量

2. 字符串和编码

字符编码

ASCII编码:127位最早
GB2312编码:中文编入
Unicode:统一的一套编码
UTF-8编码:把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。

Python的字符串

Python字符串是以Unicode编码的
Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符

在文件开头写上这两行:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;

第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

格式化

%s永远起作用,它会把任何数据类型转换为字符串

3. list和tuple

list

list是一种有序的集合,可以随时添加和删除其中的元素。

tuple

元组,tuple和list非常类似,但是tuple一旦初始化就不能修改

4.条件判断

if <条件判断1>:
    <执行1>
elif <条件判断2>:
    <执行2>
elif <条件判断3>:
    <执行3>
else:
    <执行4>

5. 模式匹配

如果要针对某个变量匹配若干种情况,可以使用match语句

score = 'B'

match score:
    case 'A':
        print('score is A.')
    case 'B':
        print('score is B.')
    case 'C':
        print('score is C.')
    case _: # _表示匹配到其他任何情况
        print('score is ???.')

6. 循环

for…in循环

names = ['Michael', 'Bob', 'Tracy']
for name in names:
    print(name)

while循环

sum = 0
n = 99
while n > 0:
    sum = sum + n
    n = n - 2
print(sum)

break
在循环中,break语句可以提前退出循环
continue
在循环过程中,也可以通过continue语句,跳过当前的这次循环,直接开始下一次循环。

7. dict 和 set

dict

Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
和list比较,dict有以下几个特点:

  1. 查找和插入的速度极快,不会随着key的增加而变慢;
  2. 需要占用大量的内存,内存浪费多。

set

set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

二、函数

1. 调用函数

Python内置了很多有用的函数,我们可以直接调用。

比如求绝对值的函数abs

>>> abs(100)
100

数据类型转换

Python内置的常用函数还包括数据类型转换函数,比如int()函数可以把其他数据类型转换为整数:

>>> int('123')
123

2. 定义函数

在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。

def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x

参数检查

调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛出TypeError

3. 函数的参数

  • 位置参数: 对于power(x)函数,参数x就是一个位置参数
  • 默认参数:
def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

设置默认参数时,有几点要注意

一是必选参数在前,默认参数在后,否则Python的解释器会报错(思考一下为什么默认参数不能放在必选参数前面);

二是如何设置默认参数。

当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

  • 可变参数: 传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个
  • 关键字参数: 允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
  • 命名关键字参数: 如果要限制关键字参数的名字,就可以用命名关键字参数.
    例如,只接收city和job作为关键字参数。这种方式定义的函数如下:
def person(name, age, *, city, job):
    print(name, age, city, job)
  • 参数组合:
    在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

4. 递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)

三、高级特性

    1. 切片
      L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3
    1. 迭代
      如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。
    1. 列表生成式
      列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
      举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11)):
    1. 生成器
      在Python中,一边循环一边计算的机制,称为生成器:generator。
    1. 迭代器
      可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

四、函数式编程

1. 高阶函数

  • map/reduce
  • filter
  • sorted 排序

2. 返回函数

  • 函数作为返回值
    高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
  • 闭包
    注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用,所以,闭包用起来简单,实现起来可不容易。
  • nonlocal
def inc():
    x = 0
    def fn():
        nonlocal x
        x = x + 1
        return x
    return fn

f = inc()
print(f()) # 1
print(f()) # 2

x作为局部变量并没有初始化,直接计算x+1是不行的。但我们其实是想引用inc()函数内部的x,所以需要在fn()函数内部加一个nonlocal x的声明。加上这个声明后,解释器把fn()的x看作外层函数的局部变量,它已经被初始化了,可以正确计算x+1

3. 匿名函数

当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
匿名函数lambda x: x * x实际上就是:

def f(x):
    return x * x

关键字lambda表示匿名函数,冒号前面的x表示函数参数。

4. 装饰器

在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。

5. 偏函数

通过设定参数的默认值,可以降低函数调用的难度。而偏函数也可以做到这一点。
functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义int2(),可以直接使用下面的代码创建一个新的函数int2:

>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85

五、模块

模块定义

在Python中,一个.py文件就称之为一个模块(Module)。
为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。
举个例子,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。

现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如mycompany,按照如下目录存放:

mycompany
├─ init.py
├─ abc.py
└─ xyz.py
引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py模块的名字就变成了mycompany.abc,类似的,xyz.py的模块名变成了mycompany.xyz

请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是mycompan

使用模块

    1. 使用import xx导入模块
    1. 作用域
    • 正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等;
    • 类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊变量,hello模块定义的文档注释也可以用特殊变量__doc__访问,我们自己的变量一般不要用这种变量名;
    • 类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;

安装第三方模块

在Python中,安装第三方模块,是通过包管理工具pip完成的。

pip install Pillow

安装常用模块

可以从Anaconda官网下载GUI安装包,下载后直接安装,Anaconda会把系统Path中的python指向自己自带的Python,并且,Anaconda安装的第三方模块会安装在Anaconda自己的路径下,不影响系统已安装的Python目录。

模块搜索路径

  1. 直接修改sys.path,添加要搜索的目录:
>>> import sys
>>> sys.path.append('/Users/michael/my_py_scripts')

这种方法是在运行时修改,运行结束后失效。

  1. 设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。
    设置方式与设置Path环境变量类似。注意只需要添加你自己的搜索路径,Python自己本身的搜索路径不受影响。

参考资料:
廖雪峰官网

你可能感兴趣的:(Python,python,开发语言)