Python学习笔记

发布时间 2024-01-13 21:30:29作者: εὕρηκα

Python学习

因为我之前使用Python复现算法,所以环境早已经进行了配置

要点简介

脚本语言是一种介乎于 HTML 和诸如 JAVA 、 Visual Basic 、 C++ 等编程语言之间的一种特殊的语言,尽管它更接近后者,但它却不具有编程语言复杂、严谨的语法和规则。有一些脚本语言已经发生了变化,如 Python,perl 已经可以编译成中间代码然后执行,这样的脚本语言已经可以被称为编译型脚本语言。
脚本语言的“优势”,其实只在于它不需要事先“编译”。所以 Python 语言不用像 Java 或者 C++ 语言需要首先进行编译,再进行运行,脚本语言可以直接读取文本文件,一边解释一边执行。

Python 是一门独特的脚本语言,快速浏览一下他的要点:

  • 面向对象:每一个变量都是一个类,有其自己的属性(attribute)与方法(method)。
  • 语法块:用缩进(四个空格)而不是分号、花括号等符号来标记。因此,行首的空格不能随意书写。
  • 注释:行内用“#”号,行间注释写在两组连续三单引号之间:’’’
  • 续行:行尾输入一个反斜杠加一个空格(’\ ‘),再换行。如果行尾语法明显未完成(比如以逗号结尾),可以直接续行。
  • 打印与输入:函数 print() 与 input(),注意 print() 的 sep 与 end 参数。
  • 变量:无需指定变量类型,也不需要提前声明变量。
  • 删除变量:del()
  • 复制变量:直接将变量a赋值给b,有时仅仅复制了一个“引用”。此后 b 与 a 的改动仍会互相影响。必要时使用 a is b 来判断是否同址。
  • 模块:通过 import pandas 的方式加载模块(或者 import pandas as pd),并用形如 pandas.DataFrame(或 pd.DataFrame)的方式调用模块内的方法。也可以使用 from pandas import DataFrame 的方式,这样在下文可以直接使用 DataFrame 作为调用名。
  • 帮助:配合使用 dir() 与 help() 命令;其中前者是输出变量所有的成员。

基础语法

  • Print 输出

    print() 默认输出是换行的,如果要实现不换行需要加上end参数。

    x="a"
    y="b"
    print(x, end=' ')
    print(y, end=' ')
  • 空格与换行
    在 Python 中,为了让代码看起来更清晰,具有更好的可读性,有时会在代码中加入空格和空行。空格或者空行与代码缩进不同,并不是 Python 语法的一部分。书写时不插入空格或者空行,Python 解释器运行也不会出错。但是空格或者空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。

    空格和空行是为了增加代码可读性。

  • Python 注释
    以‘#’开头的语句是注释,不一定要出现在行首,在某些语句后面也可以加注释,注释是给人看的,可以是任意内容,解释器会忽略掉注释,但注意不要使用无意义的注释。
    Python 中单行注释采用 # 开头,Python 没有块注释,所以现在推荐的多行注释也是采用的 # 比如:

      #!/usr/bin/python
      # First comment
      print "Hello, Python!";  # second comment
    
  • 多行语句
    Python 语句中一般以新行作为为语句的结束符。
    但是我们可以使用斜杠( \)将一行的语句分为多行显示,如下所示:

    total = item_one + \
          item_two + \
          item_three
    

    语句中包含[], {} 或 () 括号就不需要使用多行连接符。如下实例:

      days = ['Monday', 'Tuesday', 'Wednesday',
          'Thursday', 'Friday']
    
  • Python 引号
    Python 接收单引号(‘ ),双引号(“ ),三引号(‘’’ “””) 来表示字符串,引号的开始与结束必须的相同类型的。
    其中三引号可以由多行组成,编写多行文本的快捷语法,常用语文档字符串,在文件的特定地点,被当做注释。

    word = 'word'
    sentence = "This is a sentence."
    paragraph = """This is a paragraph. It is
    made up of multiple lines and sentences."""
  • 缩进
    任何一种编程语言都有各自的语法和编程规范,Python 之所以以‘优雅,简单’著称,其中一个最重要的原因,就是它的“缩进”。大部分的编程语言都是使用“{}”来表示一个语句块或者代码段,而 Python 用缩进层次来组织代码块,而约定一个缩进是用‘4个空格’来表示,请务必遵守约定俗成的习惯,坚持使用4个空格的缩进。
    如果是用文本编辑器或者 IDE,可以把 Tab 自动转换为4个空格,然后用 tab 键来使用缩进,确保不混用 Tab 和空格。
    缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量,这个必须严格执行。如下所示:

      if True:
          print("neo")
      else:
          print("smile")
    
  • Python 关键字
    下面的列表显示了在 Python 中的保留字。这些保留字不能用作常数或变数,或任何其他标识符名称。

所有Python的关键字只包含小写字母。

and exec not
assert finally or
break for pass
class from print
continue global raise
def if return
del import try
elif in while
else is with
except lambda yield
  • Python 标识符
    标识符是电脑语言中允许作为名字的有效字符串集合。其中,有一部分是关键字,构成语言的标识符。这样的标识符是不能做它用的标识符的,否则会引起语法错误(SyntaxError 异常)。

    合法的 Python 标识符,需要遵守如下规定:

    • 第一个字符必须是字母或下划线(_)
    • 剩下的字符可以是字母和数字或下划线
    • 大小写敏感
    • 不能是 Python 的关键字,例如 def、class 就不能作为标识符

    以下划线开头的标识符是有特殊意义的。以单下划线开头 _foo 的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用from xxx import *而导入。
    以双下划线开头的_ _foo代表类的私有成员,以双下划线开头和结尾的_ _foo_ _代表Python里特殊方法专用的标识,如_ _init_ _()代表类的构造函数。
    Python 可以同一行显示多条语句,方法是用分号 ; 分开,如:

>>> print("hello");print("world");
hello
world

变量

字符串

创建字符串可以使用单引号、双引号、三单引号和三双引号,其中三引号可以多行定义字符串,Python 不支持单字符类型,单字符也在Python也是作为一个字符串使用。
我们定义一个 s='python'语句,它在计算机中的执行顺序是先在内存中创建一个字符串 Python ,在程序栈寄存器中创建一个变量 s,最后把 Python 的地址赋给s 。
再来看看字符串的一些常见操作:

s = '学习Python'
# 切片
s[0], s[-1], s[3:], s[::-1] # '学', 'n', 'ython', 'nohtyP的习学'
# 替换,还可以使用正则表达式替换
s.replace('Python', 'Java') # '学习Java'

# 查找,find()、index()、rfind()、rindex()
s.find('P')   # 3, 返回第一次出现的子串的下标
s.find('h', 2)   # 6, 设定下标2开始查找
s.find('23333')   # -1, 查找不到返回-1
s.index('y')   # 4, 返回第一次出现的子串的下标
s.index('P')  # 不同与find(), 查找不到会抛出异常

# 转大小写
upper()
lower()
swapcase()
capitalize()
istitle()
isupper()
islower()

s.upper()   # '学习PYTHON'
s.swapcase()  # '学习pYTHON', 大小写互换
s.istitle()  # True
s.islower()   # False

# 去空格
strip()
lstrip()
rstrip()

# 格式化
s1 = '%s %s' % ('Windrivder', 21)    # 'Windrivder 21'
s2 = '{}, {}'.format(21, 'Windridver')    # 推荐使用format格式化字符串
s3 = '{0}, {1}, {0}'.format('Windrivder', 21)
s4 = '{name}: {age}'.format(age=21, name='Windrivder')
# 连接与分割,使用 + 连接字符串,每次操作会重新计算、开辟、释放内存,效率很低,所以推荐使用join
l = ['2017', '03', '29', '22:00']
s5 = '-'.join(l)    # '2017-03-29-22:00'
s6 = s5.split('-')    # ['2017', '03', '29', '22:00']

以上是一些常见的操作。
另外还有一点需要注意的是字符串编码,所有的 Python 字符串都是 Unicode 字符串,当需要将文件保存到外设或进行网络传输时,就要进行编码转换,将字符转换为字节,以提高效率。

# encode 将字符转换为字节
str = '学习Python'
print (str.encode())           # 默认编码是 UTF-8  输出:b'\xe5\xad\xa6\xe4\xb9\xa0Python'
print (str.encode('gbk'))      # 输出  b'\xd1\xa7\xcf\xb0Python'
# decode 将字节转换为字符
print (str.encode().decode('utf8'))   # 输出 '学习Python'
print (str.encode('gbk').decode('gbk'))             # 输出 '学习Python'

List(列表)

列表是写在方括号 [] 之间、用逗号分隔开的元素列表,列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套),列表中的元素是可以改变。

示例:

Weekday = ['Monday','Tuesday','Wednesday','Thursday','Friday']
print(Weekday[0])   # 输出 Monday

#list 搜索
print(Weekday.index("Wednesday"))

#list 增加元素
Weekday.append("new")
print(Weekday)

# list 删除
Weekday.remove("Thursday")
print(Weekday)

Tuple(元组

元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号 () 里,元素之间用逗号隔开,组中的元素类型也可以不相同。
示例:

letters = ('a','b','c','d','e','f','g')
print(letters[0])  # 输出 'a'
print(letters[0:3])  # 输出一组 ('a', 'b', 'c')

Sets(集合)

集合(set)是一个无序不重复元素的序列,使用大括号 {} 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 {} ,因为 {} 是用来创建一个空字典。

集合不能被切片也不能被索引,除了做集合运算之外,集合元素可以被添加还有删除:
示例:

a_set = {1,2,3,4}
# 添加
a_set.add(5)
print(a_set)  # 输出{1, 2, 3, 4, 5}
# 删除
a_set.discard(5)
print(a_set)  # 输出{1, 2, 3, 4}

Dictionary(字典)

字典是一种映射类型,它的元素是键值对,字典的关键字必须为不可变类型,且不能重复。创建空字典使用 {} 。

Logo_code = {
 'BIDU':'Baidu',
 'SINA':'Sina',
 'YOKU':'Youku'
 }
print(Logo_code)
# 输出{'BIDU': 'Baidu', 'YOKU': 'Youku', 'SINA': 'Sina'}
print (Logo_code['SINA'])       # 输出键为 'one' 的值
print (Logo_code.keys())   # 输出所有键
print (Logo_code.values()) # 输出所有值
print (len(Logo_code))  # 输出字段长度

Python流程控制

if 语句

if 语句表示如何发生什么样的条件,执行什么样的逻辑。
语法:

# x = int(input("Please enter an integer: "))
x = -5
if  x < 0:
    x = 0
    print('Negative changed to zero')
elif x == 0:
    print('Zero')
elif x == 1:
    print('Single')
else:
    print('More')

for 循环

Python for 循环可以遍历任何序列的项目,如一个 列表 或者一个 字符串

'''
for 后跟变量名,in 后跟序列,注意加冒号
for 循环每次从序列中取一个值放到变量中
此处的序列主要指 列表  元组   字符串   文件
'''
for iterating_var in sequence:
对于按顺序iterating_var:
   statements(s)

eg:

for letter in 'Python':     # 第一个实例
   print('当前字母 :', letter)

fruits = ['banana', 'apple',  'mango']
for fruit in fruits:        # 第二个实例
   print('当前字母 :', fruit)

print("Good bye!")
# 也可以通过索引地址来遍历内容
fruits = ['banana', 'apple',  'mango']
for index in range(len(fruits)):
   print('当前水果 :', fruits[index])

print("Good bye!")

while 循环

Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为:

count = 0
while (count < 9):
   print( 'The count is:', count)
   count = count + 1
print("Good bye!")
#也可以在 while 循环中添加判断逻辑
count = 0 
while count < 5:
   print(count, " is  less than 6")
   count = count + 1
else:
   print(count, " is not less than 6")

range() 函数

如果你需要一个数值序列,内置函数 range() 会很方便,它生成一个等差级数链表:

range (start, end, scan):

参数含义:
start:计数从 start 开始。默认是从 0 开始。例如 range(5) 等价于 range(0, 5);
end:计数到 end 结束,但不包括 end.例如:range(0, 5) 是[0, 1, 2, 3, 4]没有 5
scan:每次跳跃的间距,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)

示例:

for i in range(6):
 print(i)
print(range(6),'finish')

for i in range(6,10):
 print(i)
print(range(6,10),'finish')

for i in range(6,12,2):
 print(i)
print(range(6,12,2),'finish')

#需要迭代链表索引的话,如下所示结合使 用 range() 和 len():
a = ['i', 'love', 'coding', 'and', 'free']
for i in range(len(a)):
    print(i, a[i])

break 用法

break 语句可以跳出 for 和 while 的循环体。如果你从 for 或 while 循环中终止,任何对应的循环 else 块将不执行。

示例:

for letter in 'ityouknow':     # 第一个实例
   if letter == 'n':        # 字母为 n 时中断
      break
   print ('当前字母 :', letter)

continue 用法

continue 语句被用来跳过当前循环块中的剩余语句,然后继续进行下一轮循环。

for letter in 'ityouknow':     # 第一个实例
   if letter == 'n':        # 字母为 n 时跳过输出
      continue
   print ('当前字母 :', letter)

pass 语句

Python pass 是空语句,是为了保持程序结构的完整性。它用于那些语法上必须要有什么语句,但程序什么也不做的场合.
示例:

while True:
  pass  # Busy-wait for keyboard interrupt (Ctrl+C)
# 这通常用于创建最小结构的类:
class MyEmptyClass:
  pass