PYTHON 学习笔记

版本:vs.18.7.21.3
这是由zhoujm整理得到,关注:


Contents

PYTHON 学习笔记

1. 字符串

1.1 替换字段名

>>> "{foo} {} {bar} {}".format(1, 2, bar=4, foo=3) 12 '3 1 4 2'
>>> ///结果如下
>>> '3 1 4 2'

在替换字段名的时候,同时可以应用索引,如下面所示:

>>> fullname = ["Alfred", "Smoketoomuch"]
>>> "Mr {name[1]}".format(name=fullname) 
'Mr Smoketoomuch'

对于之中的对象的字段名的替换例子如下:

>>> import math
>>> tmpl = "The {mod.__name__} module defines the value {mod.pi} for π" 
>>> tmpl.format(mod=math)
'The math module defines the value 3.141592653589793 for π'

在这个例子当中,__name__的对象为pi,并且在math的大类当中。


1.2 基本转换

直接用例子说话:

>>> print("{pi!s} {pi!r} {pi!a}".format(pi="π")) 
π 'π' '\u03c0'

s,r,a分别是str,repr和ASCII。


对数据进行处理的另一个例子:

>>> "The number is {num}".format(num=42)
'The number is 42'
>>> "The number is {num:f}".format(num=42) 
'The number is 42.000000'
>>> "The number is {num:b}".format(num=42) 
'The number is 101010'

Detail: you can add this like

>>> 'One googol is {:,}'.format(10**100)
'One googol is 10,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,00 0,000,000,000,000,000,000,000,000,000,000,000,000,000,000'

具体格式对应:
< -> 右对齐
> -> 左对齐
^ -> 居中对齐
例子又来了:

>>> print('{0:<10.2f}\n{0:^10.2f}\n{0:>10.2f}'.format(pi)) 
3.14
     3.14
            3.14

其他重要元素

  • +,-
  • #(为数据进制加上前缀)

1.3 字符串方法

1.3.1 center

居中作用

>>> "The Middle by Jimmy Eat World".center(39)
'     The Middle by Jimmy Eat World     '
>>> "The Middle by Jimmy Eat World".center(39, "*") 
'*****The Middle by Jimmy Eat World*****'

1.3.2 find

在字符串当中寻找子串。如果找到,就返回子串的第一个字符的索引,否则返回-1。并且find方法是可以设置起始的.find('',begin,end)

1.3.3 join

合并序列
target.join(list)

>>> seq = [1, 2, 3, 4, 5]
>>> sep = '+'
>>> sep.join(seq) 
/// 尝试合并一个数字列表 
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: sequence item 0: expected string, int found 
>>> seq = ['1', '2', '3', '4', '5']
>>> sep.join(seq) 
/// 合并一个字符串列表
'1+2+3+4+5'
>>> dirs = '', 'usr', 'bin', 'env'
>>> '/'.join(dirs)
'/usr/bin/env'
>>> print('C:' + '\\'.join(dirs))
C:\usr\bin\env

1.3.4 lower

这个简单,略略略

1.3.4.1词首大写

这个方法在模块string中。

>>> import string
>>> string.capwords("that's all , folks")
That's All, Folks

1.3.5 replace

'string'.replace('a','b')

1.3.6 split

'string'.split('target')

1.3.7 strip

删除字符串首位空白并返回
.strip()

2. 当索引行不通时

2.1 字典

表达方式:
phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}

2.1.1 函数dict

可使用函数dict从其他映射(如其他字典)或键值对序列创建字典。

>>> items = [('name', 'Gumby'), ('age', 42)] >>> d = dict(items)
>>> d
{'age': 42, 'name': 'Gumby'}
>>> d['name'] 
'Gumby'

2.1.2 字典的基本操作与方法

常见:
len(),d[k],d[k] = v
del d[k] delete the key which named as k.
k in d check if the k (key) is in the d (dictionary) .

下面是一个制作并访问电话簿的例子:

people = {
    'Alice': {
        'phone': '2341',
        'addr': 'Foo drive 23' },
    'Beth': {
        'phone': '9102',
        'addr': 'Bar street 42' }
}
#_this is a label_
labels = {
         'phone': 'phone number',
         'addr': 'address' }
name = input('Name: ')
request = input('Phone number (p) or address (a)? ')
if request == 'a': key = 'addr'
if request == 'p': key = 'phone'
if name in people: print("{}'s {} is {}.".format(name, labels[key], people[name][key]))
  • Format_map
>>> phonebook
{'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'}
>>> "Cecil's phone number is {Cecil}.".format_map(phonebook) 
"Cecil's phone number is 3258."

2.1.3 字典方法

methodHow does it workexample
1.cleardelete all unitsd.clear()
2.copy/deepcopycopy the dictd.copy()/d.deepcopy()
3.fromkeyscreate a new dict that contains all the keys you need(the value of each one is None)d.fromkeys([ ])
4.getget unit without crashd.get( 'xx','None')
5.itemreturn a list contains all itemsd.item()
6. keysreturn a dict mapd.keys()
7.popas you knowd.pop()
8. popitemas you knowd.popitem()

这里再介绍三个方法:

  • setdefault:这个方法类似get,在判断结束的时候,会在dict当中加上没有的item
  • update:使用一个字典里的项目来更新另一个字典的项目
  • value:返回字典视图,返回相同值。

3. 语句

3.1再谈print和import

  • 打印多组数据不换行 print("string",end=' ')
  • 导入模块重命名 from module1 import open as open1 from module2 import open as open2
  • 序列解包
>>> a, b, *rest = [1, 2, 3, 4] 
>>> rest
[3, 4]

*号也可以放在其他位置

  • 链式赋值
  • 增强赋值

3.2 条件和条件语句

布尔值为假:
False,None0,"",(),[],{}
Key words
is,in

3.3 循环语句

  • while
  • for

key words
range()
for语句同时可以遍历字典

3.3.1迭代

  • 并行迭代
  • 迭代时索引

例子又来了

for string in strings:
    if 'xxx' in string:
        index = strings.index(string) 
        strings[index] = '[censored]'

追踪迭代
for index, string in enumerate(strings):

3.3.2 跳出循环

  1. break
  2. continu:直接开始下一次迭代
  3. pass:啥都不干
  4. del: delete

3.4 使用exec和eval执行字符串及计算结果

  • exec 函数exec将字符串作为代码执行。
>>> exec("print('Hello, world!')")
Hello, world!

然而,调用函数exec时只给它提供一个参数绝非好事。在大多数情况下,还应向它传递一个 命名空间——用于放置变量的地方;否则代码将污染你的命名空间,即修改你的变量。例如,假 设代码使用了名称sqrt,结果将如何呢?

>>> from math import sqrt
>>> exec("sqrt = 1")
>>> sqrt(4)
Traceback (most recent call last):
File "<pyshell#18>", line 1, in ? sqrt(4)
TypeError: object is not callable: 1

既然如此,为何要将字符串作为代码执行呢?函数exec主要用于动态地创建代码字符串。如 果这种字符串来自其他地方(可能是用户),就几乎无法确定它将包含什么内容。因此为了安全 起见,要提供一个字典以充当命名空间。为此,你添加第二个参数—字典,用作代码字符串的命名空间

>>> from math import sqrt
>>> scope = {}
>>> exec('sqrt = 1', scope)
>>> sqrt(4)
2.0
>>> scope['sqrt'] 1

eval是一个类似于exec的内置函数。exec执行一系列Python语句,而eval计算用字符串表示 的Python表达式的值,并返回结果(exec什么都不返回,因为它本身是条语句)。例如,你可使 用如下代码来创建一个Python计算器:

>>> eval(input("Enter an arithmetic expression: ")) 
Enter an arithmetic expression: 6 + 18 * 2
42

4. 抽象(懒惰是一种美德)

4.1定义函数

def hello(name):
    return 'Hello, ' + name + '!'

运行这些代码后,将有一个名为hello的新函数。它返回一个字符串,其中包含向唯一参数 指定的人发出的问候语。你可像使用内置函数那样使用这个函数。

>>> print(hello('world')) 
Hello, world!
>>> print(hello('Gumby')) 
Hello, Gumby!

很不错吧?如果编写一个函数,返回一个由斐波那契数组成的列表呢?很容易!只需使用前 面介绍的代码,但不从用户那里读取数字,而是通过参数来获取。

def fibs(num):  
    result = [0, 1]
    for i in range(num-2): 
            result.append(result[-2] + result[-1])
    return result

执行这些代码后,解释器就知道如何计算斐波那契数了。现在你不用再关心这些细节,而只 需调用函数fibs。
在这个示例中,num和result也可以使用其他名字,但return语句非常重要。return语句用于 从函数返回值(在前面的hello函数中,return语句的作用也是一样的)。

4.2 给函数编写文档

要给函数编写文档,以确保其他人能够理解,可添加注释(以#打头的内容)。还有另一种 编写注释的方式,就是添加独立的字符串。在有些地方,如def语句后面(以及模块和类的开 头,这将在第7章和第10章详细介绍),添加这样的字符串很有用。放在函数开头的字符串称为 文档字符串(docstring),将作为函数的一部分存储起来。下面的代码演示了如何给函数添加文 档字符串:

def square(x):
    'Calculates the square of the number x.'    
    return x * x

可以像下面这样访问文档字符串:

>>> square.__doc__
'Calculates the square of the number x.'

顺带
函数help

4.3 参数魔法

字符串(以及数和元组)是immutable的,这意味着你不能修改它们(即只能替换 为新值)。因此这些类型作为参数没什么可说的。

  • 如果参数是不可变的

在有些语言(如C++、Pascal和Ada)中,经常需要给参数赋值并让这种修改影响函数外部的变 量。在Python中,没法直接这样做,只能修改参数对象本身。但如果参数是不可变的(如数)呢? 不好意思,没办法。在这种情况下,应从函数返回所有需要的值(如果需要返回多个值,就
以元组的方式返回它们)。例如,可以像下面这样编写将变量的值加1的函数:

>>> def inc(x):return x + 1
...
>>> foo = 10
>>> foo = inc(foo)
>>> foo 
11

或者使用global转为全局变量使用。

  • 良好的关键字参数习惯

虽然这样做的输入量多些,但每个参数的作用清晰明了。另外,参数的顺序错了也没关系。
然而,关键字参数最大的优点在于,可以指定默认值。

def hello_3(greeting='Hello', name='world'):
    print('{}, {}!'.format(greeting, name))

收集参数

def print_params(*params): 
    print(params)

这样的函数中*号代表将所有的参数都收集到同一个tuple当中。同时也可以有多个元素的输入,*就代表将剩下的参数收集到tuple当中。
例外:当函数定义的时候*号所在位置为中间某个值的话,在调用函数的时候需要将*之后的参数进行一一对应。

  • WANING:*是不会收集关键字参数的。

  • 如果是需要收集关键字参数的话,**可以做到。同时,这样的方法是将关键字参数储存到字典当中。

分配参数

*同时可以将参数从tuple当中分配出来执行相应的函数。

def add(x, y): 
    return x + y
params = (1, 2)
_______________________
>>> add(*params)
3

字典同理。

4.4 作用域

Tip:
Vars()函数返回内部指针字典。
在局部,局部变量优先程度大于全局变量。

函数的嵌套

def multiplier(factor):
    def multiplyByFactor(number):
        return number * factor 
    return multiplyByFactor

在这里,一个函数位于另一个函数中,且外面的函数返回里面的函数。也就是返回一个 函数,而不是调用它。重要的是,返回的函数能够访问其定义所在的作用域。换而言之,它 携带着自己所在的环境(和相关的局部变量)!

函数的闭包:

>>> double = multiplier(2)
>>> double(5)
10
>>> mutiplier(4)(5)
20

函数的递归
简单地说,递归意味着引用自身。

二分查找算法:

def search(sequence, number, lower, upper): 
    if lower == upper:
        assert number == sequence[upper]
        return upper 
    else:
        middle = (lower + upper) // 2 
        if number > sequence[middle]:
            return search(sequence, number, middle + 1, upper) 
        else:
            return search(sequence, number, lower, middle)

5. 对象

  • 多态
  • 封装
  • 继承

5.1 介绍

5.1.1 多态

很多函数和运算符都是多态的,你编写的大多数函数也可能如此,即便你不是有意为之。每 当你使用多态的函数和运算符时,多态都将发挥作用。

5.1.2 封装

封装(encapsulation)指的是向外部隐藏不必要的细节。这听起来有点像多态(无需知道对 象的内部细节就可使用它)。这两个概念很像,因为它们都是抽象的原则。它们都像函数一样, 可帮助你处理程序的组成部分,让你无需关心不必要的细节。

5.1.3 继承

继承是另一种偷懒的方式。我们总是想避免多次输入同样的代码。前 面通过创建函数来达成这个目标,但现在要解决一个更微妙的问题。如果你已经有了一个类,并 要创建一个与之很像的类(可能只是新增了几个方法),该如何办呢?创建这个新类时,你不想 复制旧类的代码,将其粘贴到新类中。

5.2 类

创建类

class Person:
    def set_name(self,name):
            self.name = name
    def set_name(self):
        return self.name
    def greet(self):
        print("hey, I am {}.".format(self.name))

5.3 属性,函数,方法

函数和方法的区别很容易看出,不赘述。方法.函数()

隐藏

只需要在方法或者属性名称之前加上__
tip破解封装:
s._Secretive__inaccessible()

类的命名空间

这两个等价
def foo(x): return x * x
foo = lambda x: x * x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值