Python | Python语法基础 #yyds干货盘点#
Posted 多氯环己烷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python | Python语法基础 #yyds干货盘点#相关的知识,希望对你有一定的参考价值。
@TOC
前言
参考资料:
笔者Python学习主要以《Python编程:从入门到实战》这本书为主,笔记的思路参考书里的脉络。其次还有笔者一年前在慕课上看的北理的嵩天教授的Python课程。嵩天教授的课很好,最大的特点是每个版块都有完整的示例代码。但可能对新手小白不太友好,有些不常用的函数容易弄混。《Python编程:从入门到实战》更适合零基础学习,里边会提到一些互通的编程思想和Python的格式规范。
结合常用函数、方法:
由于笔者有Java的编程基础,因此这里只记录Python跟Java不一样的地方以及一些易忘点和难点,重点放在Python的语法基础。对于新手朋友还是先看书为好。结合《Python常用函数、方法示例总结(API)》来看可能效果会好一些。
1. 变量与简单数据结构
.py
指出这是一个Python程序,编辑器将使用Python解释器运行它;- Python解释器读取整个程序,确定其中每个单词含义;
- 程序无法成功运行时,解释器会提供一个
traceback
。traceback是一条记录,指出解释器尝试运行代码时,在什么地方陷入困境; - 在Python中,可以用单引号或双引号括起字符串;
- Python中的转义符:
\\n
换行(光标到下行首);\\r
回车(光标回到本行首);\\t
制表符,\\n\\t
表示换行并在下一行开头添加制表符;\\b
回退;
- Python2中,有些
print
语句包含括号,有些不包含; - Python使用两个乘号表示乘方,如:
3 ** 2 == 9
; - Python2中除法
\\
将小数部分直接删除。Python3中保留小数。但在Python2中:3.0 / 2 == 1.5
; -
Python之禅:Python的一些编程理念。在终端输入
import this
即可获取; - Python关键字:
- Python内置函数:
2. 列表相关
- 一个列表示例:
bicycles = [ trek, cannondale, redline]
。注意方括号与逗号; - 打印列表示例:
print(bicycles)
; - 访问列表元素:
bicycles[0]
--- > trek; - 访问列表倒数第x元素:
bicycles[-x]
--- > 当x=1时输出:redline; - 使用for循环遍历列表:
for object in list: print(object)
- 列表解析:
list = [num**2 for num in range(1s, 11)]
---> 输出1到10的平方; - 遍历部分列表:
for object in list[firstNum: lastNum]:
; - 可以使用
list[:]
的方法复制列表; - 元祖相关:
- Python中将不能修改的值称为不可变的,而不可变的列表称为元祖;
- 在编程上与列表不同之处在于其使用
()
或tuple()
或不使用括号;而列表使用[]
或list()
; - 元组因为创建后不能修改,因此没有特殊操作;
- 如果提出修改Python语言修改建议,需要编写Python改进提案(PEP)。PEP 8是最古老的PEP之一,其规定了以下一些Python代码格式规范:
- 每级缩进4个空格。需要对文本编辑器(或ide)设置tab键为4个空格;
- Python解释器根据水平缩进解读代码,不关心垂直间距;
- 建议每行不超过个字符;
- 建议比较运算符两边各添加一个空格;
3. 集合
- 一个集合示例:
bicycles = trek, cannondale, redline
。注意大括号与逗号; - 集合的特点是不能重复;
-
利用集合数据去重:
s = set(list) #利用集合无重复元素的特点去重 l = list(s) #将集合转变回列表
4. If语句
- Python在检查是否相同时考虑大小写;
- 大部分时候检查两个指不等的效率更高;
- 在Python中使用
and
和or
表示并与或,而不是&&
和||
; - 检查列表是否含有特定值的语句:
if(object in list)
,也可以用if(object not in list)
; - Python的if语句基本结构如下(注意冒号):
if conditional_test1: do something1 elif conditional_test2: do something2 else: do other
- 判断列表是否为空:
if list:
5. 字典
- 事实上,可将任意Python对象用作字典中的值;
- 一个字典的示例:
alien0 = color: green, points: 5
- 遍历字典:
for key, value in map.items():
- 遍历字典的键:
for object in map.keys():
或for object in map:
,因为遍历字典默认遍历所有的键; - 按顺序遍历字典所有的键:
for object in sorted(map.keys()):
- 遍历字典的值:
for object in map.values():
- 遍历字典的值,剔除重复项:
for object in set(map.values()):
- 列表和字典的嵌套层级不应太多,如果太多,可能有更简单的解决问题的方案;
6. 用户输入和while循环
- 在Python 3里使用
input()
方法,而在Python 2.7里使用raw_input()
方法; - 循环语句:
while conditional_test:
- 可以使用
break
关键字退出循环,这里的循环包括while和for循环; - 可以使用
continue
关键字继续循环; - 使用循环处理列表:
while object in list:
7. 函数
-
不带返回值的函数定义示例:
def greet_user(username, age=1): #username没有设定默认值必须放在形参列表开头 """显示简单问候语""" print("hello, " + username.title() + ", age is " + str(age)) greet_user(jesse, 18) #位置实参 greet_user(age=18, username=jesse) #关键字实参 greet_user(jesse) #使用默认值age=1
- 第二行为文档字符串注释,描述函数是做什么的;
- 后面为函数调用;
-
带普通返回值的函数定义示例:
def greet_user(username, age=1): #username没有设定默认值必须放在形参列表开头 """显示简单问候语""" print("hello, " + username.title() + ", age is " + str(age)) return username.title()
-
带字典返回值的函数定义示例:
def build_person(first_name, last_name): #username没有设定默认值必须放在形参列表开头 """返回字典""" person = first: first_name, last: last_name return person
-
传递列表参数,列表会修改:
def greet_users(names): """传入参数为列表""" for name in names: msg = "Hello, " + name.title() + "!" print(mas) usermanes = [margot, hannah, ty] greet_users(usernames)
- 传递列表参数的副本,列表不会修改:
def greet_users(names[:]):
-
传递任意数量的实参:*toppings可以理解成列表;
def make_pizza(*toppings): """打印顾客点的所有配料""" print(toppings) make_pizza(pepperoni) make_pizza(mushrooms, green peppers, etra cheese)
- Python创建一个名为toppings的空元组;
- 结合使用位置实参和任意数量实参:
def make_pizza(size, *toppings):
- 必须将接纳任意数量实参的形参
*toppings
放在最后;
- 必须将接纳任意数量实参的形参
-
使用任意数量的关键字实参:\\user_info**可以理解成字典;
def build_profile(name, **user_info): """创建一个字典,其中包含我们知道的有关用户的一切""" profile = profile[name] = name for key, value in user_info.items(): profile[key] = value return profile user_profile = build_profile(albert, location=princeton, field=physics) print(user_profile)
- 在Python中,import的是模块,使用模块.方法(参数)即可调用模块里的函数;
- 导入特定函数,并使用该函数示例:
from module_name import function_0, function_1 function_0() function_1(参数)
- 使用
as
给函数指定别名:from model import function as fn
;后续使用fn()
即可调用function函数; - 使用
as
给模块指定别名:import model as md
;后续使用md.function()
即可调用函数; - 导入模块所有函数:
from model import *
;后续直接使用model里的函数function()
即可调用函数; - 可以在函数类使用
global
关键字声明变量是全局变量; -
lambda表达式:
<函数名> = lambda <参数> : <表达式>
;- 示例:
>>> f = lambda x, y : x + y >>> f(10, 15) 25
- 示例:
- 函数与模块编写细节:
- 外部函数导入的推荐做法:只导入所需要使用的函数 / 导入整个模块并使用句点表示法;
- 函数和模块的命名应使用小写字母和下划线,而不是驼峰命名法;
- 函数注释紧跟在函数定义后面,使用文档字符串格式;
- 给形参指定默认值时,等号=两边不要有空格;
8. 类与对象
- 类中的函数叫方法;
-
一个类示例:模块名为
dog.py
"""表示小狗和电子狗的类""" class Dog(): """模拟小狗""" def __init__(self, name): """初始化实例""" self.name = name self.age = 1 #给属性指定默认值 def get_age(self): """返回年龄""" return self.age def set_age(self, age): """设置年龄""" self.age = age def sit(self): """模拟小狗被命令时蹲下""" print(self.name.title() + " is now sitting.") class TinyDog(Dog): """小狗是狗的子类""" def __init__(self, name) """初始化父类的属性""" super().__init__(name)
__init__()
方法:形参self必不可少,而且必须位与其他参数前面;- 创建Dog实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,其是一个指向实例本身的应用,让实例能够访问类中的属性和方法;
self.
为前缀的变量都可供类中的所有方法使用,像这样可以通过实例访问的变量称为属性;
-
有关父子类:
- 子类和父类必须包含在当前文件中,父类必须在子类前面;
- 子类定义中括号内必须指定父类名称;
super()
是一个特殊函数,将父类和子类关联起来;- 在Python 2.7中,
super()
方法需要传递两个实参:子类名和self,并且父类定义的括号内指定字段object;
-
在Python 2.7中创建类时,需要在括号类内包含单词object:
class ClassName(object):
-
类实例(对象)的示例:
class Dog(): --snip-- my_dog = Dog(willie) dog_name = my_dog.name #获取属性 dog_name = my_dog.get_age() #通过方法获取属性 my_dog.name = jucy #直接修改属性 my_dog.set_age = 18 #通过方法修改属性 my_dog.sit() #调用方法
- 从dog.py模块里导入多个类:
from dog import Dog, TinyDog
; - 导入整个dog.py模块,然后用句点表示访问需要的类:
import dog
; - collections模块里包含一个类
OrderedDict
。该类的实例行为几乎与字典相同,区别在于其记录了键值对的顺序; - 类的编码风格:
- 类采用驼峰命名法,类中的每个单词首字母大写;
- 实例名和模块名采用小写,并在单词之间加上下划线;
- 一个空行分隔方法;两个空格分隔类;
- 需要同时导入标准库和模块和
9. 文件
-
打开并读取一个文件,并将其内容显示到屏幕上:
with open(xxx.txt) as file_object: contents = file_object.read() print(contents)
- 打开文件
open()
和关闭文件close()
可以同时使用,但当有bug时close()
执行不了会导致文件无法关闭。不写close()
将由Python确定是否关闭文件; with
关键字在不再需要访问文件后将其关闭;- 直接打印contents会多出一个空行,可以这样打印
print(contens.rstrip())
;
- 打开文件
- 有关文件绝对路径:
- Linux和OS X:
file_path = /home/.../xxx.txt
; - Windows:
file_path = C:\\...\\xxx.txt
; - 建议将数据文件存储在程序文件所在的目录,或程序文件所在目录的下一级文件夹;
- Linux和OS X:
-
逐行读取:
with open(filename) as file_object: for line in file_object: print(line)
- 同理,直接打印contents会多出一个空行,可以这样打印
print(line.rstrip())
;
- 同理,直接打印contents会多出一个空行,可以这样打印
- 使用
with
关键字时,open()
返回的对象只在with代码块内可用; - 在处理文件相关时注意使用
strip()
或rstrip()
去除字符串两边的空格; - Python将所有文本都解读成字符串;
open(xxx.txt, w)
:以写入方式打开文件;- 其他参数还有
r
读取、a
附加、r+
读写; a
附加:将内容附加到文件末尾,而不是覆盖文件原来的内容;- 以
w
写入模式打开文件需要小心,如果指定文件名已存在,Python将在返回对象前清空文件; - Python只能将字符串写入文本文件;
- 其他参数还有
10. 异常
-
使用 try-except 处理异常:
try: print(5/0) except ZeroDivisionError: print(捕获到ZeroDivisionError异常) else: print(未捕获异常) finally: print(无论是否有异常都会执行)
- 可在
except
的缩进块里添加关键字pass跳过错误捕获; - 其中,
else
和finally
部分的代码块可省;
- 可在
11. 测试
- 使用Python标准库中的模块
unittest
进行测试; -
一个简单的测试示例:
import unittest from model_name import function_name class TestCase(unittest.TestCase): """测试函数function_name""" def setUp(self): """构建前置条件""" def test_function(self): run_result = function_name(parameter) self.assertEqual(run_result, correct_result) unittest.main()
- 首先导入模块
unittest
和被测试方法function_name
; - 然后创建
TestCase
类,其包含各种具体的单元测试方法。该类继承unittest.TestCase
类; setUp()
方法的作用是创建前置条件;- 编写测试方法
test_function
,方法名必须以test_
打头; - 使用断言
assertEqual()
判断函数执行结果与预期结果的差别; unittest.main()
让Python运行这个文件中的测试;
- 首先导入模块
- unittest里常用的6个断言方法请见《Python常用函数、方法示例总结(API)》;
- 每完成一个测试,Python都会打印一个字符:
- 测试通过打印句点
.
; - 测试引发错误打印一个
E
; - 测试导致断言失败打印一个
F
;
- 测试通过打印句点
最后
::: hljs-center
新人制作,如有错误,欢迎指出,感激不尽!
:::
::: hljs-center
欢迎关注公众号,会分享一些更日常的东西!
:::
::: hljs-center
如需转载,请标注出处!
:::
::: hljs-center
:::
以上是关于Python | Python语法基础 #yyds干货盘点#的主要内容,如果未能解决你的问题,请参考以下文章
# yyds干货盘点 # 盘点一道Python取整的基础题目
# yyds干货盘点 # 盘点Python列表的一道基础题目
#yyds干货盘点#return用法 - python基础学习系列(64)