• Python3学习笔记


    前言

    本文不是一篇系统的从零开始学习Python的教程,如果你需要从零开始学习Python,廖雪峰的官方网站Python教程这部分将是比较好的一种选择,如果你英语比较好,也可以在国外的一些网站上找到优质的教学视频(比如某油管视频网站)。

    阅读本文的前提可能需要你有一定的编程基础,并最好了解一种以上其他主流的面向对象的编程语言,比如Java、C#、PHP等。

    首先需要了解的是,Python与PHP类似,是一种解释型的编程语言,与之对应的是Java、C#这类编译型的语言。我自己有比较丰富的C#和PHP方面的经验,两种类型的语言(指解释型和编译型)各有各的优缺点。随着各种语言的发展,现在各种语言之间也会互相借鉴一些好的特性,因此语言之间的差异也开始越来越模糊。所以我认为语言并没有好坏之分,而是某种语言会更适合在某些场景下使用,如果你会多种语言,可以根据需求选用不同的语言开发,从而达到事半功倍的效果。


    基本语法

    这里只说三点,与其他语言相同或者相似之处就不做解释了。

    注释

    • 单行注释符号: #

    # This is one line comment

    • 多行注释: 以'''(三个单引号)起始,并以'''结束的
    
    '''
    These lines are comments.
    You can write multiple lines here.
    xxxxxxx
    '''
    
    

    行末 : 符号

    if, elif, else, for, def, class等关键字行的行末应加上, 否则会报语法错误。


    缩进

    Python用的是4个空格作为缩进,作用域也不用花括号括起来,而是通过缩进来判断:

    
    class TestClass():
    	def test_func():	# 4个空格缩进,表示在TestClass范围内
    		if True:		# 8个空格缩进,表示在TestClass的test_func范围内
    			pass		# 12个空格缩进,表示在TestClass的test_func的if判断内
    		
    		print('xxx')    # 8个空格缩进,表示在TestClass的test_func范围内
    	
    	print('test')		# 4个空格缩进,表示在TestClass范围内
    
    print('abc')			# 没有缩进,表示执行的时候总会执行到这一行
    
    

    有别于其他语言的一些特性

    数字操作符

    数字操作符中,有两个值得一说的操作符。

    • 除法/将得到小数结果,地板除//将自动向下取整:

    18 / 4 = 4.5
    18 // 4 = 4

    • 计算指数**

    5 ** 3 = 125


    字符串

    字符串前缀

    r:raw string

    s = 'daniel fu' # 将输出两行,第一行为daniel,第二行是fu
    s = r'daniel fu' # 将只输出一行: daniel fu, 其中 将直接输出而不作为换行符来对待

    b:binary

    print(b'xe2x82xac20'.decode('utf-8')) # 将输出€20

    f:format

    
    name = 'Daniel'
    age = 33
    print(f'My name is {name.upper()} and I am {age} years old.')
    
    # 输出结果:
    My name is DANIEL and I am 33 years old.
    
    

    切片

    
    name = "Hello there, my name is Daniel Fu and I`m 33 years old."
    
    print(name[4]) # 字母o(hello的最后一个字母),从左至右第5个字母(因为index是从0开始)
    
    print(name[-3]) # 字母l(old中的l),index为负数表示从右至左第三个字母(-0和0没有区别,因此负index是从-1开始的)
    
    print(name[6:11]) # 结果为"there", 即从index6开始,到index11结束(但不包含11)的所有内容
    
    print(name[:5]) # 结果为"Hello",省略起始值,则表示从0开始
    
    print(name[45:]) # 结果为"years old.", 省略终止值表示从index45开始,直至字符串结束的所有内容
    
    print(name[:]) # 省略起止值,即返回整个字符串
    
    print(name[::5]) # 结果为"Hlotee ynm sDne uadIm3 er l.",第三个参数表示结果中每隔N(此例为5)个字母返回一个
    
    print(name[::-2]) # 结果为".l re 3mIdau enDs mny eetolH",表示将字符串反转之后,每隔N(此例为2)个字母返回一个
    
    

    切片是个非常有意思的特性,有了这个特性,实现某些功能将会异常简单,举两个例子:

    • 判断字符串是否是回文
    def is_palindrome(x):
        if not isinstance(x, str):
            x = str(x)
        return x == x[::-1]
    
    print(is_palindrome('abcdedcba')) # True
    print(is_palindrome(123454321)) # True
    print(is_palindrome('abcdefg')) # False
    
    

    • 字符串首字母大写,其他小写
    
    def capitalize_word(x):
        if not isinstance(x, str):
            return 'Argument should be a word'
    	else:
        	return x[:1].upper() + x[1:].lower()
    
    print(capitalize_word('daniel')) # Daniel
    
    print(capitalize_word('CHINA')) # China
    print(capitalize_word('wOrLd')) # World
    print(capitalize_word(13)) # Argument should be a word
    print(capitalize_word(True)) # Argument should be a word
    
    

    利用切片这种操作,有些在其他语言里看起来需要多行代码才能搞定的功能,在Python里的核心代码可能只需要一行。另外,数组(array)和元组(tuple)也可以使用切片功能,用法上和字符串切片是一样的:

    
    chars = ['a', 'b', 'c', 'd', 'e', 'f'] # 改成元组: ('a', 'b', 'c', 'd', 'e', 'f') 也是一样的效果,返回的结果是元组而不是数组
    
    print(chars[1]) # b 
    print(chars[-1]) # f 
    print(chars[1,3]) # ['b', 'c']
    print(chars[:2]) # ['a', 'b']
    print(chars[4:]) # ['e', 'f']
    print(chars[::-1]) # ['f', 'e', 'd', 'c', 'b', 'a']
    print(chars[::2]) # ['a', 'c', 'e']
    print(chars[::-2]) # ['f', 'd', 'b']
    
    

    函数参数

    可变参数列表

    
    def test_func(*args):
    	for ar in args:
    		print(ar)
    		
    print(test_func(['d', 'e', 'f'])) # 结果为:['d', 'e', 'f']
    print(test_func(*['d', 'e', 'f'])) # 结果为: 'd', 'e', 'f' 三行,表示传入了3个参数。
    
    

    另外一个比较有意思的例子:

    
    def drop_first_last(grades):
    	first, *middle, last = grades # 这句将传入的参数的第一个值赋给first变量,最后一个值赋给last变量,其他任意多的值,赋给*middle这个可变长变量
    	avg = sum(middle) / len(middle)
    	return avg
    	
    print(drop_first_last([1, 2, 3, 4])) # 2.5 去掉1和4之后,求2和3的平均值
    
    

    列表展开

    定义多个变量,自动对应到列表中的值:

    
    a1, b1, c1 = [1, 2, 3]
    print(a1) # 1
    print(b1) # 2
    print(c1) # 3
    
    a2, b2, c2 = (11, 12, 13)
    print(a2) # 11
    print(b2) # 12
    print(c2) # 13
    
    a3, b3, c3 = 'abc'
    print(a3) # a
    print(b3) # b
    print(c3) # c
    
    # 参数数量对不上,则会报错
    a4, b4 = ['a', 'b', 'c']  # ValueError: too many values to unpack (expected 2)
    
    
    

    多父类继承

    很多语言都只能从单一父类继承,而Python可以多个父类继承。

    
    class Animal(object):
    	def __init__(self, name):
    		self.name = name
    
    	def run(self):
    		print(self.name, 'is running!')
    		
    class AmuseThing(object):
    	def amuse(self):
    		print(self.name, 'is amusing you!')
    
    class Dog(Animal):
    	def bark(self):
    		print(self.name, 'is barking!')
    
    class Husky(Dog, AmuseThing):
    	pass
    	
    husky = Husky('Idiot husky')
    husky.run() # 从Dog中继承,而Dog从Animal中继承
    husky.bark() # 从Dog中继承
    husky.amuse() # 从AmuseThing中继承
    
    

    掌握了这些知识点之后,我们对Python有了一定的了解,这样在后续进阶一点的学习过程中,我们可以充分利用某些特性来实现我们的需求。


    本文在博客园和我的个人博客www.fujiabin.com上同步发布。转载请注明来源。

  • 相关阅读:
    行为型模式续(中介者模式 + 解释器模式)
    行为型模式下<迭代器模式、访问者模式、备忘录模式>
    行为型模式中<职责链模式、状态模式、观察者模式>
    下载vuejs,Hello Vue(vscode)
    node.js运行配置(vs code非控制台输出)
    node.js环境配置(windows系统)
    玩转visual studio系列之类设计图
    xml基础之二(XML结构【2】)DTD文档模版
    xml基础之二(XML结构【1】)
    XML的基础之一(概念和语法)
  • 原文地址:https://www.cnblogs.com/wushangjue/p/7977193.html
Copyright © 2020-2023  润新知