为什么想起学Python了?
之所以想起学学Python是有三个缘由。从时间顺序上看,首先是在10月中旬,笔者去学校招聘会走了走,发现招Python开发的挺多的,有在线教育、智慧城市等行业,基本以数据挖掘处理为主。其次是10月中旬接到了腾讯微信搜一搜后台的实习面试邀请,那边招C++和Python开发,用的是腾讯自研框架。最后也是最重要的,在11月上旬,笔者参加的电子设计大赛F题送药小车核心点在图像识别,而市面上用的比较多的OpenMV需要用Python开发。这让笔者意识到是时候该学学Python了,虽然说学好一门语言后再学第二门会很简单,但万一遇到紧急项目,总不能再花时间在语法基础上吧,项目所需要的框架也是需要学习成本的。
Python与Java?
笔者对Java比较熟练,也是以Java作为第一门语言开始学习的。有了一定开发经验后最大的感受是确实能快速上手Python,特别是面向对象那块,毕竟编程思想是可以互通的。至于以后会不会从事Python相关的开发工作,要看市场和项目需求,现阶段还是会以Java的学习为重,笔者Java还有好多好多要学的呢,Python暂时学来玩玩刷刷leetcode就好了。
参考资料:
笔者Python学习主要以《Python编程:从入门到实战》这本书为主,笔记的思路参考书里的脉络。其次还有笔者一年前在慕课上看的北理的嵩天教授的Python课程。嵩天教授的课很好,最大的特点是每个版块都有完整的示例代码。但可能对新手小白不太友好,有些不常用的函数容易弄混。《Python编程:从入门到实战》更适合零基础学习,里边会提到一些互通的编程思想和Python的格式规范。
结合常用函数、方法:
由于笔者有Java的编程基础,因此这里只记录Python跟Java不一样的地方以及一些易忘点和难点,重点放在Python的语法基础。对于新手朋友还是先看书为好。结合《Python常用函数、方法示例总结(API)》来看可能效果会好一些。
.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内置函数:
-
一个列表示例:
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解释器根据水平缩进解读代码,不关心垂直间距;
- 建议每行不超过个字符;
-
建议比较运算符两边各添加一个空格;
-
一个集合示例:
bicycles = { 'trek', 'cannondale', 'redline'}
。注意 大括号与 逗号; - 集合的特点是不能重复;
- 利用集合数据去重:
s = set(list) #利用集合无重复元素的特点去重
l = list(s) #将集合转变回列表
- Python在检查是否相同时考虑大小写;
- 多数情况下,检查两个手指之间的差异更有效率
[En]
most of the time, it is more efficient to check the difference between two fingers.*
- 在Python中使用
and
和or
表示并与或,而不是&&
和||
; - 检查列表是否含有特定值的语句:
if(object in list)
,也可以用if(object not in list)
; - Python的if语句基本结构如下(注意冒号):
if conditional_test1: do something1elif conditional_test2: do something2else: do other
判断列表是否为空:
if list:
-
事实上,可将任意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()):
-
列表和词典的嵌套层数不应该太多,如果太多,可能会有更简单的解决方案
[En]
there should not be too many nesting levels of lists and dictionaries, if too many, there may be a simpler solution to the problem*
-
在Python 3里使用
input()
方法,而在Python 2.7里使用raw_input()
方法; - 循环语句:
while conditional_test:
- 可以使用
break
关键字退出循环,这里的循环包括while和for循环; - 可以使用
continue
关键字继续循环; -
使用循环处理列表:
while object in list:
-
没有返回值的函数定义示例:
[En]
example of a function definition without a return value:*
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
- 第二行为 文档字符串注释,描述函数是做什么的;
- 后面为函数调用;
- 具有普通返回值的函数定义示例:
[En]
example of a function definition with ordinary return values:*
def greet_user(username, age=1): #username没有设定默认值必须放在形参列表开头 """显示简单问候语""" print("hello, " + username.title() + ", age is " + str(age)) return username.title()
- 带有字典返回值的函数定义示例:
[En]
example of a function definition with a dictionary return value:*
def build_person(first_name, last_name): #username没有设定默认值必须放在形参列表开头 """返回字典""" person = {'first': first_name, 'last': last_name} return person
- 传递列表参数,修改列表:
[En]
pass the list parameters, and the list will be modified:*
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 profileuser_profile = build_profile('albert', location='princeton', field='physics')print(user_profile)
- 在Python中,import的是模块,使用 模块.方法(参数)即可调用模块里的函数;
- 导入特定函数,并以此函数为例:
[En]
Import a specific function and use this function as an example:*
from module_name import function_0, function_1function_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>>> f = lambda : "lambda表达式">>> print(f())lambda表达式
- 函数与模块编写细节:
- 外部函数导入的推荐做法:只导入所需要使用的函数 / 导入整个模块并使用句点表示法;
- 函数和模块的命名应使用小写字母和下划线,而不是驼峰命名法;
- 函数注释紧跟在函数定义后面,使用文档字符串格式;
给形参指定默认值时, 等号=两边不要有空格;
-
类中的函数叫方法;
- 一个类示例:模块名为
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
。该类的实例行为几乎与字典相同,区别在于其记录了 键值对的顺序; - 类的编码风格:
- 类采用驼峰命名法,类中的每个单词首字母大写;
- 实例名和模块名采用小写,并在单词之间加上下划线;
- 一个空行分隔方法;两个空格分隔类;
-
需要同时导入标准库和模块和
-
打开和阅读文件,并在屏幕上显示其内容:
[En]
Open and read a file and display its contents on the screen:*
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
; - 建议将数据文件存储在程序文件所在的目录,或程序文件所在目录的下一级文件夹;
- 逐行读取:
with open(filename) as file_object:
for line in file_object:
print(line)
- 同理,直接打印contents会多出一个空行,可以这样打印
print(line.rstrip())
; - 使用
with
关键字时,open()
返回的对象只在with代码块内可用; - 在处理文件相关时注意使用
strip()
或rstrip()
去除字符串两边的空格; - Python将所有文本都解读成字符串;
open('xxx.txt', 'w')
:以写入方式打开文件;- 其他参数还有
r
读取、a
附加、r+
读写; a
附加:将内容附加到文件末尾,而不是覆盖文件原来的内容;- 以
w
写入模式打开文件需要小心,如果指定文件名已存在,Python将在返回对象前清空文件; -
Python只能将字符串写入文本文件;
-
使用 try-except 处理异常:
try:
print(5/0)
except ZeroDivisionError:
print('捕获到ZeroDivisionError异常')
else:
print('未捕获异常')
finally:
print('无论是否有异常都会执行')
- 可在
except
的缩进块里添加关键字 pass跳过错误捕获; -
其中,
else
和finally
部分的代码块可省; -
使用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
;
新出品,如果有什么错误,欢迎指点,非常感谢!欢迎关注公众号,将分享更多的日常事物!如需转载,请注明出处!
[En]
New production, if there are any mistakes, welcome to point out, thank you very much! Welcome to follow the official account, will share some more daily things! If you need to reprint, please mark the source!
Original: https://www.cnblogs.com/dlhjw/p/15559012.html
Author: 多氯环己烷
Title: Python | Python语法基础
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/510758/
转载文章受原作者版权保护。转载请注明原作者出处!