1.Python基础要点

Python解释器

CPython:官方版本的解释器,用C语言开发。在命令行下运行python就是启动CPython解释器。CPython是使用最广的Python解释器。CPython用>>>作为提示符
IPython:IPython是基于CPython之上的一个交互式解释器,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。IPython用In [序号]:作为提示符
如果要和Java或.Net平台交互,最好的办法不是用Jython或IronPython,而是通过网络调用来交互,确保各程序之间的独立性。

输入和输出

输出:

# 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字。
print('hello, world')
# print()函数也可以接受多个字符串,用逗号“,”隔开,每个“,”会输出一个空格
print('The quick brown fox', 'jumps over', 'the lazy dog')
# print()也可以打印整数,或者计算结果,下面输出300
print(100 + 200)

输入:

# input()可以让用户输入字符串,并存放到一个变量里
name = input()
# input()可以显示一个字符串来提示用户
name = input('please enter your name: ')

缩进

缩进的好处:强迫写出格式化的代码,强迫写出缩进较少的代码,better把一段很长的代码拆分成若干函数,从而得到缩进较少的代码。
缩进的坏处:复制-粘贴功能失效。重构代码时,粘贴过去的代码必须重新检查缩进是否正确。此外,IDE很难像格式化Java代码那样格式化Python代码

字符编码

Python 3版本中字符串以Unicode编码,Python的字符串支持多语言
Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。
把str变为以字节为单位的bytes:以Unicode表示的str通过encode()方法可以编码为指定的bytes,把bytes变为str需要用decode()方法:

'ABC'.encode('ascii') # b'ABC'
'中文'.encode('utf-8') # b'\xe4\xb8\xad\xe6\x96\x87'
'中文'.encode('ascii') # 中文编码的范围超过了ASCII编码的范围,Python会报错
b'ABC'.decode('ascii') # 'ABC'
b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') # '中文'
b'\xe4\xb8\xad\xff'.decode('utf-8') # 如果bytes中包含无法解码的字节,decode()方法会报错
# 可以传入errors='ignore'忽略错误的字节
b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore') # '中'

由于Python源代码也是一个文本文件,所以,当源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,通常在文件开头写上:

# -*- coding: utf-8 -*-

格式化

Python中,采用的格式化方式和C语言是一致的,用%实现

'Hello, %s' % 'world' # 'Hello, world'
'Hi, %s, you have $%d.' % ('Michael', 1000000) # 'Hi, Michael, you have $1000000.'
print('%2d-%02d' % (3, 1)) #  3-01(注意3前面有个空格)
print('%.2f' % 3.1415926) # 3.14

常见占位符替换:

  • %s表示用字符串替换
  • %d表示用整数替换
  • %f表示用浮点数替换
  • %x表示用十六进制整数替换

有几个%?占位符,后面就跟几个变量或者值,顺序要对应。如果只有一个%?,括号可以省略
格式化还可采用format()或f-string:

# format():
'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125) # 'Hello, 小明, 成绩提升了 17.1%'

# f-string
r = 2.5
s = 3.14 * r ** 2
print(f'The area of a circle with radius {r} is {s:.2f}') # The area of a circle with radius 2.5 is 19.62
练习

小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点,并用字符串格式化显示出’xx.x%’,只保留小数点后1位:

# -*- coding: utf-8 -*-

s1 = 72
s2 = 85
r = (s2 / s1 - 1) * 100.0
print('%.1f%%' % r)

list和tuple

list是一种有序的集合,可以随时添加和删除其中的元素。list添加元素用append(默认到队尾),添加到指定位置用insert(index, element),删除list末尾的元素,用pop(),删除指定位置的元素,用pop(i)方法
tuple和list非常类似,但是tuple一旦初始化就不能修改,因为tuple不可变,所以代码更安全

练习

用索引取出下面list的指定元素:

# -*- coding: utf-8 -*-

L = [
    ['Apple', 'Google', 'Microsoft'],
    ['Java', 'Python', 'Ruby', 'PHP'],
    ['Adam', 'Bart', 'Lisa']
]
# 打印Apple:
print(L[0][0])
# 打印Python:
print(L[1][1])
# 打印Lisa:
print(L[2][2])

条件判断

条件判断可以让计算机自己做选择,Python的if…elif…else很灵活
条件判断从上向下匹配,当满足条件时执行对应的块内语句,后续的elif和else都不再执行

练习

小明身高1.75,体重80.5kg。请根据BMI公式(体重除以身高的平方)帮小明计算他的BMI指数,并根据BMI指数:

  • 低于18.5:过轻
  • 18.5-25:正常
  • 25-28:过重
  • 28-32:肥胖
  • 高于32:严重肥胖
    用if-elif判断并打印结果:
# -*- coding: utf-8 -*-

height = 1.75
weight = 80.5
bmi = weight / (height * height)
if bmi < 18.5:
    print('过轻')
elif bmi < 25:
    print('正常')
elif bmi < 28:
    print('过重')
elif bmi < 32:
    print('肥胖')
else:
    print('严重肥胖')

循环

Python的循环有两种,一种是for…in循环,第二种循环是while循环,只要条件满足,就不断循环,条件不满足时退出循环。
在循环中,break语句可以提前退出循环。continue语句,跳过当前的这次循环,直接开始下一次循环。这两个语句通常都必须配合if语句使用。
不要滥用break和continue语句。break和continue会造成代码执行逻辑分叉过多,容易出错。大多数循环并不需要用到break和continue语句,有些时候,如果代码写得有问题,会让程序陷入“死循环”,也就是永远循环下去。这时可以用Ctrl+C退出程序,或者强制结束Python进程。

练习

请利用循环依次对list中的每个名字打印出Hello, xxx!:

# -*- coding: utf-8 -*-
L = ['Bart', 'Lisa', 'Adam']
for name in L:
    print('Hello, '+ name + '!')

dict和set

和list比较,dict的特点是:查找和插入的速度极快,不会随着key的增加而变慢;需要占用大量的内存,内存浪费多。
dict是用空间来换取时间的一种方法。dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在
dict的key必须是不可变对象。在Python中,字符串、整数等都是不可变的,list是可变的,不能作为key
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key
创建一个set,需要提供一个list作为输入集合,重复元素在set中自动被过滤。
set可以看成数学意义上的无序和无重复元素的集合,两个set可以做数学意义上的交集、并集等操作。set的原理和dict一样,所以不可以放入可变对象

函数

定义函数

定义函数时,需要确定函数名和参数个数;如果有必要,可以先对参数的数据类型做检查;
函数体内部可以用return随时返回函数结果;函数执行完毕也没有return语句时,自动return None。
函数可以同时返回多个值,但其实就是一个tuple。

练习

请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0的两个解。
计算平方根可以调用math.sqrt()函数,一元二次方程的求根公式为:
x = − b ± b 2 − 4 a c 2 a x=\dfrac{-b\plusmn\sqrt{b^2-4ac}}{2a} x=2ab±b24ac

# -*- coding: utf-8 -*-
import math
def quadratic(a, b, c):
    x = math.sqrt(b*b - 4*a*c)/(2*a)
    return (-b/(2*a) + x,-b/(2*a) - x)

函数的参数

对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。
默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误
定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数。
*args是可变参数,args接收的是一个tuple
允许用
把一个list或tuple变成可变参数传入:

def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

nums = [1, 2, 3]
# *nums表示把nums这个list的所有元素作为可变参数传进去
calc(*nums) # 输出14

关键字参数:允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict,类似地,允许用**把一个dict变成关键字参数传入
命名关键字参数
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,可在函数内部通过kw检查。如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。

def person(name, age, *, city, job):
    print(name, age, city, job)

和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了
命名关键字参数必须传入参数名,可以有缺省值,从而简化调用
参数组合
在Python中定义函数,必选参数、默认参数、可变参数、关键字参数和命名关键字参数这5种参数都可以组合使用。但是参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。
虽然可以组合多达5种参数,但不要同时使用太多的组合,否则函数接口的可理解性很差。

练习

定义函数允许接收一个或多个数并计算乘积:

# -*- coding: utf-8 -*-
def mul(x, *numbers):
    multiple = 1
    if len(numbers)==0:
        return x
    else:
        for num in list(numbers):
            multiple = multiple * num
        return multiple * x

递归函数

函数内部可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。
针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。
Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。

练习

汉诺塔的移动可以用递归函数非常简单地实现。请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法:

# -*- coding: utf-8 -*-
def move(n, a, b, c):
    if n == 1:
        print(a, '-->', c)
    else:
        move(n-1, a, c, b)
        move(1, a, b, c)
        move(n-1, b, a, c)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值