我的博客
欢迎来到我的博客
bunny.icu

Python基本语法

Python基本语法

1.变量

Pyhton中,变量赋值前不需要定义,类型由值决定,值类型与变量类型不同也可以复赋值。
Python有五个数据类型:Numbers(数字)、String(字符串)、List(列表)、Tuple(元组)、Dictionary(字典)。

2.Numbers(数字)

数字有四种类型:int、long、float、complex,其中复数的实部和虚部都是float型。
浮点数直接运算像Java一样,会存在不精确的问题。

3.String(字符串)

用引号括起来的都是字符串,包括单引号、双引号、三引号。

3.1修改大小写

字符串.title()方法会字符串中每个单词的首字符改为大写。

3.2拼接

字符串拼接直接用加号,与Java相同。
字符串与数字不能直接拼接,需要使用函数str(数字)将其强制转换。

3.3转义符

\n \t 与Java相同。

3.4删除首尾空格

字符串.lstrip()
字符串.rstrip()
字符串.strip()
这三个方法返回值是操作后的字符串,如果不将返回值存储到变量中,得到的字符串就知识临时的。

4.运算

4.1运算符

+、-、*、/与Java类似,但整数用/相除,得到的是值,不是商
//:求商
%:求模(余数)
**:乘方

5.输入、输出、注释

5.1输入

5.1.1接收输入

函数input()可以接受用户输入的数据,可以将输入提示作为该方法的参数,返回值是输入的值,例如:

name = input('Please enter your name: ')

5.1.2类型转换

input()函数的返回值类型是字符串,如果要转换,可以用函数int()进行强制转换。
这个函数不能对input()方法的返回值直接强制转换接受,例如下面语句是错误的:
int(age) = input(‘Please enter your age: ‘)
需要注意,Python中,将字符串与数字进行等布尔运算不会报错,但得不到想要的结果,这种错误难以发现如果需要的值不是字符串类型,接收后一定要将其转换。

5.2输出

print()函数的参数可以是字符串、数字、列表、字典等。
print()函数可接受的参数有很多,可以用逗号分隔,可以设置输入的分隔符,可以设置结尾符号(默认\n)等。

5.3注释

单行注释写在# 后面,多行注释写在三个引号中,例如:

'''
这是多行注释
这是多行注释
'''
"""
这是多行注释
这是多行注释
"""

6.List(列表)

6.1格式

bicycles = ['trek', 'cannondale', 'redline', 'specialized']

6.2访问

bicycles[索引]
索引可以是负数,表示倒数第几个。

6.3修改

6.3.1更新

例如:

bicycles[2] = 'blueline'

6.3.2添加

使用append方法,可以将元素添加到列表末尾,例如:

bicycles.append("xxxx")

使用insert()方法,可以将元素插入到指定位置,第一个参数是索引,第二个参数是值,例如:

bicycles.insert(2, 'yyyy') 

表示插入到第三个元素的位置,后面的元素索引+1。

6.3.3删除

6.3.3.1del语句

可以删除列表的指定元素,例如:

del bicycles[1]

表示删除第二个元素,后面的元素索引-1。

6.3.3.2pop()方法

可以从列表中弹出一个值,参数是索引,默认为-1,返回值是弹出的值,例如:

print(bicycles.pop(2))

表示删除第三个元素,同时打印这个元素。

6.3.3.3方法remove()

可以根据值删除元素,参数是指定值,例如:

bicycles.remove('trek')

6.4组织列表

6.4.1排序

6.4.1.1sort()方法

可以将列表元素永久按字母顺序排序,再也无法恢复成原始顺序,也可以向sort()方法传递参数reverse=True将其改为逆序,例如:

bicycles.sort(reverse=True)

6.4.1.2sorted()方法

临时排序,只在当前语句中生效,不影响列表中的原始顺序。

6.4.1.3reverse()方法

将列表元素永久逆序,再次调用该方法可恢复原来的顺序。

6.4.2确定长度

函数len(列表)可以快速获取列表的长度。

6.4.3获取索引

index(值)可以获取值对应的索引。

6.5遍历列表

6.5.1for循环

python中的for循环,与Java的加强for循环类似:

for bicycle in bicycles:
    print(bicycle)

6.5.2使用数字列表

如果python要让for循环实现与Java标准for循环相同的功能,可以利用数值列表。
函数range()可以生成一系列数字,例如:

range(1,5)

生成的一系列数字由数字1~4组成。
如果要将range(…)的结果转换为列表,可以使用函数list(),例如:

numbers = list(range(1,5))

6.5.3数字列表的计算

对于数字列表digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0],可以进行一些计算。

6.5.3.1简单统计

min(),max(),sum()

6.5.3.2列表解析

对遍历的列表通过一定的运算生成一个新的列表,可以用如下表达式:

squares = [value**2 for value in digits] 

这里的句尾没有冒号

6.6切片

6.6.1格式

列表[起始索引:终止索引],例如:

print(bicycles[2:6])

打印索引为2到5的元素,即第3个到第6个元素。
索引同样可以使用负数,起始索引或终止索引都可以省略,表示某一端没有限制。

6.6.2复制列表

复制列表要使用切片的方式:

bicycles2 = bicycles[:] 

切片不指定索引。
复制列表不能使用这样的方式:

bicycles2 = bicycles

这样只是复制了列表的内存地址,并不是复制列表的值,操作其中一个列表,另一个列表也会改变。

6.6.3步长

切片还可以指定步长
[::-1]可使字符串或列表反转

7.Tuple(元组)

7.1简介

元组看起来跟列表比较相似,区别在于元组使用圆括号而不是方括号,元组的元素不可变。
元组中如果只有一个变量,必须在变量后添加一个逗号。

7.2访问

可以通过索引访问,格式:

dimensions[索引]

遍历的方式也与列表相同。

7.3修改

虽然不能修改元组的元素,但可以给存储元组的变量赋值。因此,如果要达到休耕了元组的目的,可以重新定义整个元组。

8.Dictionary(字典)

字典与Java中的Map相似,以键值对的形式保存。

8.1定义

例如:

alien_0  = {'color': 'green', 'point': 5}

字典中元素是可修改的,所以也可以初始化为空字典{}。

8.2访问

字典[键],例如:

alien_0['color']

8.3添加键值对

可以直接赋值,例如:

alien_0['x'] = 20

8.4修改值

同样是直接赋值:

alien_0['x'] = 10

8.5删除键值对

使用del语句:

del alien_0['point']

遍历

8.5.1遍历键值对

遍历键值对要使用for循环和item()方法,item()方法的作用是返回一个键值对列表。遍历键值对的语句:

for key, value in alien_0.items():
    print('key: ' + key)
print('value: ' + str(value)+'\n')

8.5.2遍历所有键

方法key()可以显式地 提取字典中的所有键,遍历所有键的语句:

for key in alien_0.keys():
    print('key: ' + key)

其中.key()也可以省略,但写出来更容易理解。
上面的语句便利的顺序是不可预测的,如果需要排序,可以使用方法sorted(),例如:

for key in sorted(alien_0.keys(),reverse=True):
    print('key: ' + key)

8.5.3遍历所有值

for value in alien_0.values():
    print('value: ' + str(value))

还可以利用set()方法忽略重复值:

for value in set(alien_0.values()):
    print('value: ' + str(value))

8.6嵌套

8.6.1列表嵌套字典

略。

8.6.2字典嵌套列表

略。

8.6.3字典嵌套字典

略。

9.流程控制

9.1条件

条件语句与Java基本相同,下面讲解不同之处和值得注意的地方。

9.1.1多个条件

if语句检查多个条件,使用运算符and和or,而 Java中使用&&和||。

9.1.2检查特定值是否在列表中

例如:

'mushrooms' in requested_things

in前面还可以用not修饰,表示不包含。

9.1.3复杂条件语句

elif相当于Java中的else if,其他的相同。

9.2循环

while循环与Java基本相同。
for循环与Java的加强for循环基本相同。
for循环有一种语句可用于列表解析。对遍历的列表通过一定的运算生成一个新的列表,可以用如下表达式:

squares = [value**2 for value in digits] 

这里的句尾没有冒号。

10.函数

10.1定义函数

使用def定义函数,例如:

def greet(username='name'):
    print('Hello, ' + username + '!')

关于实参、形参、默认参数的概念,与Java一样。
定义函数,形参不用指定类型。
如果一个参数给出了默认值,那么后面的参数都要求给出默认值。
如果函数有返回值,不需要在定义时指定返回值的类型,返回值类型由实际返回值类型决定。

10.2调用函数

可以直接传参,也可以以等式的方式传参,后者没有顺序要求。

10.3禁止函数修改列表

如果直接向函数传递列表,函数修改列表时,这个列表在函数外也会被修改,因为共用了内存地址。
要解决这个问题,调用函数时可以向函数传递列表的副本,例如:

add(numbers[:])

10.4任意数量实参

定义函数的时候,形参的前面带上星号*,可以让程序创建一个空元组,并将接收到的所有值都封装到这个元组中,例如:

def add(*numbers):
    sum = 0
    for number in numbers:
        sum += number
    return sum

任意数量的实参,必需放到最后。
如果在形参的前面加上两个型号**,可以让程序创建一个空字典,并将接收到的所有键值对都封装到这个字典中,用法同上。

10.5导入模块与函数

导入整个模块:import 模块名 as 别名
导入模块中特定函数:from 模块名 import 函数名 as 别名
导入模块中所有函数:from 模块名 import *

11.类

11.1类的创建

class 类名() :
    内容

类名首字母大写。

11.2类中的方法

类中的函数称为方法。

11.2.1方法init()

这是一个特殊的方法,用类创建实例时会自动调用,相当于Java中的构造方法。
参数中self必不可少且位于第一个,用参数创建实例时不需要提供此参数。
例如:

class Dog():
    def __init__(self, name, age):
        self.name = name
        self.age = age

此例中,name和age相当于Java类中的常量,可以供类的其他方法调用。
self.name是类中的name,name是实参name,第三行的作用是将变量关联到当前创建的实例。
init()方法的其他参数可以有默认值。

11.2.2修改属性的方法

可以参考Java中的set方法。

11.3创建实例

与Java基本相同,例如:

my_dog = Dog('willie', 6)

11.4继承

class 子类名(父类名):
    内容

例如:

class PetKind(Pet):
    def __init__(self, name, age, kind):
        super().__init__(name, age)
        self.kind = kind
my_petKind = PetKind('willie', 6, 'dog')

调用父类的init()方法或娶她方法,需要使用函数super(),这是一个特殊函数,可以将子类与父类关联起来。

11.5类中的属性

实例也可以作为属性,与Java 同理。

11.6导入类

Python中,一个.py文件就是一个模块,模块中既能有函数又能有类,导入类与前面导入函数的方式类似。
可以导入整个模块:import 模块名 as 别名
导入模块中特定的类:from 模块名 import 类名1, 类名2…
导入模块中所有的类:from 模块名 import *

12.文件

12.1读取

读取的所有文本,都会被始位字符串,如果要使用数字,就要将其强转位int或float类型。

12.1.1读取整个文件

with open(r'M:\code\PycharmProjects\PythonStudy\chapter10\files\test.txt') as file_object:
    contents = file_object.read()
    print(contents)

文件路径,可以是绝对路径或相对路径。
在Linux和OS X中,目录通常用斜杠/表示,在Windows中,目录通常用反斜杠\表示,由于反斜杠是转义符,所以通常要在路径的引号前加上r。

12.1.2逐行读取

可以采用循环的方式:

with open('files/test.txt') as file_object:
    for line in file_object:
        print(line)

12.2写入

12.2.1写入文本

filename = 'files/test2.txt'
with open(filename, 'w') as file_object:
    file_object.write("This is a file...")

上面的代码中,open函数的第二个参数是文件打开模式,’w’方式会重建文件,常用的打开模式有以下几种:

r   只读
w   写入,重建文件
a   写入,在为文末追加,不存在则创建之
+   更新
b   打开二进制文件,可与以上四种连用
U   支持所有换行符。“\r”“\n”“\r\n”

write()函数会直接在末尾写入内容,可以多次使用该函数。

12.2.2写入json数据

需要导入库json
函数json.dump()用来将json格式数据写入文件,参数是要写入的json数据和打开的文件,例如:

import json
numbers = [2, 3, 5, 7, 11, 13, 17, 19]
filename = 'numbers.json'
with open(filename, 'w') as f_obj:
    json.dump(numbers, f_obj)

函数json.load()用来读取包含json数据的文件,参数是打开的文件,返回值是json格式的数据,在python中对应的类型是list和dict。

filename = 'numbers.json'
with open(filename) as f_obj:
    numbers = json.load(f_obj)

函数json.loads()读取json字符串,将其转换为list或dict。

13.异常

13.1 try

try-except-else-final语句与Java中的try-catch语句类似。

try:
    print(1/0)
except ZeroDivisionError:
    print('error')

except后面需要指出错误名称(不指出也可以,会有警告)。
在except语句中,可以些pass,表示出现错误直接跳过,什么都不做。
else只在不出现错误的情况下执行,不常用。
final无论是否出现愈长都会执行。

13.2 断言

assert expression

相当于

if not expression:
    raise AssertionError

14.测试

14.1针对函数的测试

使用单元测试,首先要导入unittest库。
测试函数的代码要放在测试类中,编写的测试类需要继承unittest.TestCase类。
完成测试类后,通过unittest.main()方法运行单元测试,例如:

import unittest
from chapter11.divide import divide
class TestDivide(unittest.TestCase):
    def testDivide(selfself):
        print(divide(1, 2))
unittest.main()

14.2针对类的测试

进行针对类的测试需要用到unittest模块中的断言方法,这些断言方法可以核实返回的值是否满足预期。测试类的代码,同样要编写在一个继承unittest.TestCase类的类中。
常用的断言方法:

assertEqual(a, b)   核实a == b
assertNotEqual(a, b)    核实a != b
assertTrue(x)   核实x为True
assertFalse 核实x为False
assertIn(item, list)    核实item在list中
assertNotIn(item, list) 核实item不在list中

测试通过打印一个句点,测试引发错误打印一个E,测试导致断言失败打印一个F。

版权声明


本作品系原创, 转载须遵循 CC BY-NC-ND 4.0 许可协议
本文标题:Python基本语法
本文链接:https://www.bunny.icu/archives/1057

推荐文章

发表评论

textsms
account_circle
email

bunny.icu

Python基本语法
Python基本语法
扫描二维码继续阅读
2018-05-02