>>> print('The quick brown fox', 'jumps over', 'the lazy dog')
The quick brown fox jumps over the lazy dog
print()会依次打印每个字符串,遇到逗号“,”会输出一个空格,因此,输出的字符串是拼起来的。
>>> print('\\\t\\')
\ \
>>> print(r'\\\t\\')
\\\t\\
>>> print('''line1
... line2
... line3''') #这个点号是换行的时候它自己加上去的
line1
line2
line3
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
File "", line 1, in
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
如果bytes中包含无法解码的字节,decode()方法会报错:
>>> b'\xe4\xb8\xad\xff'.decode('utf-8')
Traceback (most recent call last):
...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节:
>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
'中'
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
>>> 'Age: %s. Gender: %s' % (25, True)
'Age: 25. Gender: True'
有些时候,字符串里面的%是一个普通字符怎么办?这个时候就需要转义,用%%来表示一个%:
>>> 'growth rate: %d %%' % 7
'growth rate: 7 %'
>>> classmates.pop(1)
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy']
>>> t = ()
>>> t
()
>>> t = (1,)
>>> t
(1,)
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
>>> d['Adam'] = 67
>>> d['Adam']
67
>>> 'Thomas' in d
False
二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:
>>> d.get('Thomas')
>>> d.get('Thomas', -1)
-1
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.remove(4)
>>> s
{1, 2, 3}
def nop():
pass
pass还可以用在其他语句里,比如:
if age >= 18:
pass
缺少了pass,代码运行就会有语法错误。
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
函数的参数有五种包括:必选参数、默认参数、可变参数、关键字参数和命名关键字参数。
位置参数:
位置参数是必选参数,传入的实参按照顺序分别赋给不同的形参。
默认参数:
作用:
使用默认参数可以简化函数的调用。
注意事项:
必选参数在前,默认参数在后,否则Python的解释器会报错
如何设置默认参数?
在调用函数的时候,传入的参数如果经常变化的话,那么就设置它为必选参数;而如果它每次输入时基本上时一样的,那么我们就设置它为默认参数,这样一来就起到了简化函数调用的作用。
调用的时候,可以按照顺序传入默认参数,同时也可以以赋值的方式传入。
如果设置默认参数L是一个变量,它指向对象[],每次调用该函数,就会改变L的内容,在下次调用时,默认参数L的内容就已经变了,不再是函数定义时的[]了。
所以,在定义默认参数要牢记一点:默认参数必须指向不变对象!
我们在编写程序时,如果可以设计一个不变对象,那就尽量设计成不变对象。
实例:
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple。,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数:
>>> calc(1, 2)
5
>>> calc()
0
Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
#*nums表示把nums这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。
实例:
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
作用:
它可以扩展函数的功能。
实例:
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
extra表示把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict,注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra。
命名关键字参数:
如果要限制接受的关键字参数的名字,就可以用命名关键字参数,
实例:
def person(name, age, *, city, job):
print(name, age, city, job)
和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
调用方式如下:
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
注意:
1.如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需一个特殊分隔符*了:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
2.命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错:
>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
File "", line 1, in
TypeError: person() takes 2 positional arguments but 4 were given
3.由于命名关键字参数city具有默认值,调用时,可不传入city参数:
def person(name, age, *, city='Beijing', job):
print(name, age, city, job)
>>> person('Jack', 24, job='Engineer')
Jack 24 Beijing Engineer
定义参数的顺序是:必选参数,默认参数,可变参数,命名关键字参数和关键字参数。
实例:
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
def f2(a, b, c=0, *, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
def 3(a, b, c=0, *args, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args,'d =', d, 'kw =', kw)
神操作:
a = L[:]
简单一步切片就可实现复制功能。
>>> del a
>>> a
Traceback (most recent call last):
File "", line 1, in
NameError: name 'a' is not defined
>>> c
'223'
#通过简单的实验,我们发现,此并不是简单的贴标签,而是真正在内存中实现了复制。
按照步长取值:
以0.01为步长取0-1的数
Octave:
>>t = [0:0.01:1]
Python:
>>> L[:1:0.01]
#实际上,大部分编程语言都是这样按步长取值的
只要是可迭代对象,无论有无下标,都可以迭代。
对于字典的迭代:
>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> for key in d:
... print(key)
...
a
c
b
说明:
1.字典并没有按照顺序打印,这也说明了字典内部并不是顺序存储,而是用了 哈希算法。
2.字典只打印了key但是却没有打印出值来,但不代表不能。
如果要迭代value,可以用for value in d.values();
如果要同时迭代key和value,可以用for k, v in d.items()。
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False
#isinstance()函数可以判断一个实例与一种类型是否匹配,如果是就返回True,否则
返回False;常用于判断数据的类型。
作用:
运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。
最简单的用法:
list(range(1, 11))
#生成含有1-10的列表
高级用法:
格式:
>>> [【要生成的元素】for 【迭代元素】 in【迭代范围】]
实例:
1.简单生成
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
2. 选择元素生成
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
3. 两层循环
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
4. 对字典进行操作
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']
5.
>>> L = ['Hello', 'World', 'IBM', 'Apple']
>>> [s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']