Python基础

Python基础

一、基本类型

        整数、浮点数、字符串、布尔值、空值

    1、字符串        

         常见的占位符有:
        占位符 替换内容
        %d  -- 整数
        %f  -- 浮点数
        %s  -- 字符串
        %x  -- 十六进制整数
            eg:str = 'hello %s, you age is %d' % ('Jack', 800)

二、扩展类型

    1、list类型

        1)list是一种有序的集合,可以随时添加和删除其中的元素
        2)classmates = ['Michael', 'Bob', 'Tracy']
        3)classmates[0]
              classmates[-3]
        4)要删除list末尾的元素,用pop()方法:classmates.pop()
        5)要删除指定位置的元素,用pop(i)方法,其中i是索引位置:classmates.pop(1)
        6)要把某个元素替换成别的元素,可以直接赋值给对应的索引位置:classmates[1] = 'Sarah'
        7)list里面的元素的数据类型也可以不同,比如:L = ['Apple', 123, True]
        8)list元素也可以是另一个list,比如:s = ['python', 'java', ['asp', 'php'], 'scheme']
        9)如果一个list中一个元素也没有,就是一个空的list,它的长度为0:

    2、tuple类型

        1)tuple一旦初始化就不能修改,比如同样是列出同学的名字:classmates = ('Michael', 'Bob', 'Tracy')
        2)因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple
        3)当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来,比如:t = (1, 2)
        4)如果要定义一个空的tuple,可以写成():t = ()
        5)要定义一个只有1个元素的tuple,如果你这么定义:t = (1,)

    3、dict类型

        1)使用键-值(key-value)存储,具有极快的查找速度
        2)
# 假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list
names = ['Michael', 'Bob', 'Tracy']
scores = [95, 75, 85]
# 用Python写一个dict如下
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
 
1
# 假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list
2
names = ['Michael', 'Bob', 'Tracy']
3
scores = [95, 75, 85]
4
# 用Python写一个dict如下
5
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
        3)除了初始化时指定外,还可以通过key放入:
d['Adam'] = 67
 
1
d['Adam'] = 67
        4)如果key不存在,dict就会报错,避免key不存在的错误,有两种办法,一是通过in判断key是否存在,二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value。
d['Thomas'] #没有值,会报错。Traceback (most recent call last):
'Thomas' in d #第一种方法,判断key是否存在
d.get('Thomas') #第二种方法,判断key是否存在
d.get('Thomas', -1) #第二种方法中的变种,自己指定不存在时返回的数值
 
1
d['Thomas'] #没有值,会报错。Traceback (most recent call last):
2
'Thomas' in d #第一种方法,判断key是否存在
3
d.get('Thomas') #第二种方法,判断key是否存在
4
d.get('Thomas', -1) #第二种方法中的变种,自己指定不存在时返回的数值
        5)删除一个key,用pop(key)方法,对应的value也会从dict中删除:
d.pop('Bob')
 
1
d.pop('Bob')
        6)和list比较,dict有以下几个特点:
            查找和插入的速度极快,不会随着key的增加而变慢;
            需要占用大量的内存,内存浪费多。
            而list相反:
            查找和插入的时间随着元素的增加而增加;
            占用空间小,浪费内存很少
        7)需要牢记的第一条就是dict的key必须是不可变对象

    4、set类型

        1)set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key
        2)要创建一个set,需要提供一个list作为输入集合
s = set([1, 2, 3])
 
1
s = set([1, 2, 3])
        3)通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:
s.add(4)
 
1
s.add(4)
        4)通过remove(key)方法可以删除元素:
s.remove(4)
 
1
s.remove(4)
        5)set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
s1 = set([1, 2, 3])
s2 = set([2, 3, 4])
s1 & s2
 
1
s1 = set([1, 2, 3])
2
s2 = set([2, 3, 4])
3
s1 & s2

三、条件判断

    1、if

age = 20
# 第一种:只有if
if age >= 18:
    print('your age is', age)

# 第二种:if..else
if age >= 18:
    print('your age is', age)
else:
    print('your age is', age)

# 第三种:if..elif..else
if age >= 18:
    print('adult')
elif age >= 6:
    print('teenager')
else:
    print('kid')

# 流程图
if <条件判断1>:
    <执行1>
elif <条件判断2>:
    <执行2>
elif <条件判断3>:
    <执行3>
else:
    <执行4>
 
1
age = 20
2
# 第一种:只有if
3
if age >= 18:
4
    print('your age is', age)
5
6
# 第二种:if..else
7
if age >= 18:
8
    print('your age is', age)
9
else:
10
    print('your age is', age)
11
12
# 第三种:if..elif..else
13
if age >= 18:
14
    print('adult')
15
elif age >= 6:
16
    print('teenager')
17
else:
18
    print('kid')
19
20
# 流程图
21
if <条件判断1>:
22
    <执行1>
23
elif <条件判断2>:
24
    <执行2>
25
elif <条件判断3>:
26
    <执行3>
27
else:
28
    <执行4>

四、循环

    1、for...in循环

names = ['Michael', 'Bob', 'Tracy']
for name in names:
    print(name)
 
1
names = ['Michael', 'Bob', 'Tracy']
2
for name in names:
3
    print(name)

    2、while循环

sum = 0
n = 99
while n > 0:
    sum = sum + n
    n = n - 2
print(sum)
 
1
sum = 0
2
n = 99
3
while n > 0:
4
    sum = sum + n
5
    n = n - 2
6
print(sum)

    3、break语句

n = 1
while n <= 100:
    if n > 10: # 当n = 11时,条件满足,执行break语句
        break # break语句会结束当前循环
    print(n)
    n = n + 1
print('END')
 
1
n = 1
2
while n <= 100:
3
    if n > 10: # 当n = 11时,条件满足,执行break语句
4
        break # break语句会结束当前循环
5
    print(n)
6
    n = n + 1
7
print('END')

    4、continue语句

n = 0
while n < 10:
    n = n + 1
    if n % 2 == 0: # 如果n是偶数,执行continue语句
        continue # continue语句会直接继续下一轮循环,后续的print()语句不会执行
    print(n)
 
1
n = 0
2
while n < 10:
3
    n = n + 1
4
    if n % 2 == 0: # 如果n是偶数,执行continue语句
5
        continue # continue语句会直接继续下一轮循环,后续的print()语句不会执行
6
    print(n)
        break语句可以在循环过程中直接退出循环,而continue语句可以提前结束本轮循环,并直接开始下一轮循环。这两个语句通常都必须配合if语句使用。要特别注意,不要滥用break和continue语句。break和continue会造成代码执行逻辑分叉过多,容易出错。大多数循环并不需要用到break和continue语句,上面的两个例子,都可以通过改写循环条件或者修改循环逻辑,去掉break和continue语句。

五、函数

    1、调用函数

        1)调用abs函数
abs(100)
 
1
abs(100)
        2)传入的参数数量不对,会报TypeError的错误
        3)传入的参数类型不能被函数所接受,也会报TypeError的错误

    2、定义函数

        1)定义一个函数要使用def语句,依次写出函数名括号括号中的参数冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回
def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x
 
1
def my_abs(x):
2
    if x >= 0:
3
        return x
4
    else:
5
        return -x
        2)用from 文件名 import 函数名 来导入my_abs()函数,注意abstest是文件名(不含.py扩展名)
        3)空函数
def nop():
    pass
 
1
def nop():
2
    pass
        4)数据类型检查可以用内置函数isinstance()实现
def my_abs(x):
    if not isinstance(x, (int, float)):  # 检查 x 是否为 int, float 类型
        raise TypeError('bad operand type')  # 抛出异常
    if x >= 0:
        return x
    else:
        return -x
 
1
def my_abs(x):
2
    if not isinstance(x, (int, float)):  # 检查 x 是否为 int, float 类型
3
        raise TypeError('bad operand type')  # 抛出异常
4
    if x >= 0:
5
        return x
6
    else:
7
        return -x
        5)函数可以返回多值,但其实就是一个tuple类型的数据        
import math

def move(x, y, step, angle=0):
    nx = x + step * math.cos(angle)
    ny = y - step * math.sin(angle)
    return nx, ny
 
1
import math
2
3
def move(x, y, step, angle=0):
4
    nx = x + step * math.cos(angle)
5
    ny = y - step * math.sin(angle)
6
    return nx, ny

    3、函数的参数

        1)位置参数
def power(x):
    return x * x
 
1
def power(x):
2
    return x * x
            对于power(x)函数,参数x就是一个位置参数
        2)默认参数
def enroll(name, gender, age=6, city='Beijing'):
    print('name:', name)
    print('gender:', gender)
    print('age:', age)
    print('city:', city)
x
 
1
def enroll(name, gender, age=6, city='Beijing'):
2
    print('name:', name)
3
    print('gender:', gender)
4
    print('age:', age)
5
    print('city:', city)
            tips:默认参数必须指向不变对象!
        3)可变参数
def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
x
 
1
def calc(*numbers):
2
    sum = 0
3
    for n in numbers:
4
        sum = sum + n * n
5
    return sum
            tips:可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数:
        4、关键字参数
def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)

# 可以传入任意个数的关键字参数    
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
            
# 简化的写法
extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, **extra)
x
 
1
def person(name, age, **kw):
2
    print('name:', name, 'age:', age, 'other:', kw)
3
4
# 可以传入任意个数的关键字参数    
5
>>> person('Bob', 35, city='Beijing')
6
name: Bob age: 35 other: {'city': 'Beijing'}
7
>>> person('Adam', 45, gender='M', job='Engineer')
8
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
9
            
10
# 简化的写法
11
extra = {'city': 'Beijing', 'job': 'Engineer'}
12
person('Jack', 24, **extra)
            tips:可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
        5、命名关键字参数
            1)限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下
# 和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
def person(name, age, *, city, job):
    print(name, age, city, job)    
x
1
# 和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
2
def person(name, age, *, city, job):
3
    print(name, age, city, job)    
            2)如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了
def person(name, age, *args, city, job):
    print(name, age, args, city, job)    
x
 
1
def person(name, age, *args, city, job):
2
    print(name, age, args, city, job)    
            tips:如果没有可变参数,就必须加一个*作为特殊分隔符。如果缺少*,Python解释器将无法识别位置参数和命名关键字参数

        6、参数组合
            1)在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
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)

# 在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去
>>> f1(1, 2)
a = 1 b = 2 c = 0 args = () kw = {}
>>> f1(1, 2, c=3)
a = 1 b = 2 c = 3 args = () kw = {}
>>> f1(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> f1(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
>>> f2(1, 2, d=99, ext=None)
a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}

# 最神奇的是通过一个tuple和dict,你也可以调用上述函数
>>> args = (1, 2, 3, 4)
>>> kw = {'d': 99, 'x': '#'}
>>> f1(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
>>> args = (1, 2, 3)
>>> kw = {'d': 88, 'x': '#'}
>>> f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}
# 虽然可以组合多达5种参数,但不要同时使用太多的组合,否则函数接口的可理解性很差。
x
1
def f1(a, b, c=0, *args, **kw):
2
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
3
4
def f2(a, b, c=0, *, d, **kw):
5
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
6
7
# 在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去
8
>>> f1(1, 2)
9
a = 1 b = 2 c = 0 args = () kw = {}
10
>>> f1(1, 2, c=3)
11
a = 1 b = 2 c = 3 args = () kw = {}
12
>>> f1(1, 2, 3, 'a', 'b')
13
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
14
>>> f1(1, 2, 3, 'a', 'b', x=99)
15
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
16
>>> f2(1, 2, d=99, ext=None)
17
a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}
18
19
# 最神奇的是通过一个tuple和dict,你也可以调用上述函数
20
>>> args = (1, 2, 3, 4)
21
>>> kw = {'d': 99, 'x': '#'}
22
>>> f1(*args, **kw)
23
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
24
>>> args = (1, 2, 3)
25
>>> kw = {'d': 88, 'x': '#'}
26
>>> f2(*args, **kw)
27
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}
28
# 虽然可以组合多达5种参数,但不要同时使用太多的组合,否则函数接口的可理解性很差。

    4、递归函数

        1)函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数
        2)我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出
# fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n
# 所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。
# 于是,fact(n)用递归的方式写出来就是:
def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)
x
 
1
# fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n
2
# 所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。
3
# 于是,fact(n)用递归的方式写出来就是:
4
def fact(n):
5
    if n==1:
6
        return 1
7
    return n * fact(n - 1)

六、高级特性








posted @ 2020-03-22 21:21  -刀狂剑痴-  阅读(184)  评论(0编辑  收藏  举报