小白的python之路
2018/04/18
自定义函数:
作业:定义自定义函数quadratic(),接收3个参数,返回一元二次方程:ax2 + bx + c = 0的2个解。
提示:计算平方根可以调用math.sqrt()函数:
# -*- coding: utf-8 -*-
import math
def quadratic(a,b,c):
p=b*b-4*a*c
if p>=0 and a!=0:
x1=(-b+math.sqrt(p))/(2*a)
x2=(-b-math.sqrt(p))/(2*a)
return x1,x2
elif a==0:
x1=x2=-c/b
return x1
else:
return('none answer')
a=float(input('Please input a='))
b=float(input('please input b='))
c=float(input('Please input c='))
print(quadratic(a,b,c))
函数的参数:
1.位置参数 2.默认参数 3.可变参数 4.关键字参数 5.命名关键字参数
1.位置参数:调用函数时根据函数定义的参数位置来传递参数。
2.默认参数:必选参数放前,默认参数放后面。(避免产生歧义而导致编译器报错)变化较小的参数放后面,变化较大的参数放前面。
3.可变参数:传入的参数个数是可变的。在参数前面增加符号'*',参数接收到后自动组装成tuple数据类型,允许传入0个或者任意个数。(可在list\tuple前面增加'*'将其中的元素变为可变参数输入。)
4.关键字参数:在参数前面增加符号'**'。参数接收到后自动组装成一个dict,允许传入0个或者任意个数。
5.命名关键字参数 :限制关键字参数的名字,例如仅接收dict中特定几个的key作为关键字参数。利用符号'*,key1,key2' '*,'后面的参数识别为命名关键字参数。
实例:计算x的n次方:
def power(x,n=2):#n=2为默认参数
s=1
while n>0:
n=n-1
s=s*x
return s
x=float(input('input x='))
n=float(input('input n='))
print(power(x,n))
参数组合
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
字符类型:'' tuple类型:() dict类型:{} list类型:[]
2018/04/19
递归函数: 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
作业:(编写汉诺塔移动函数)
请编写move(n, a, b, c)
函数,它接收参数n
,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法:
def move(n,a='a',b='b',c='c'):#定义汉诺塔移动函数
if n==1:
print(a,'-->',c)#仅有1个盘子时将盘子从a移动到c
else:
move(n-1,a,c,b)#将n-1层以下的盘子从a移动到b
move(1,a,b,c)#将第一层盘子(最大一个)从a移动到c
move(n-1,b,a,c)#将剩余n-1层盘子从b移动到c
#测试
n=int(input('盘子个数:'))
print(move(n))
对于汉诺塔的算法理解:
如何理解汉诺塔的递归? - Fireman A的回答 - 知乎
切片:取一个list或者tuple中的部分元素。
作业:利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()
方法:
#利用切片(slice)操作,实现一个trim()函数,去除掉字符串首位的空格,不涉及使用str的strip()方法
def trim(s):
while s[0]==' ':
s=s[1:]
while s[-1]==' ':
s=s[:-1]
return s
#测试
print(trim(' 孤独是一种美德 '))
#递归方法解决该问题
def trim2(s):
if s[:1]==' ':
return trim2(s[1:])
if s[-1:]==' ':
return trim2(s[:-1])
return s
if&while 差别:while循环语句,可以执行多次,if是条件语句,只是单次执行。
2018/04/21更新: strip函数
#rstrip():剔除字符串结尾的空白 lstrip():剔除字符串开头的空白 strip():剔除字符串开头和结尾的空白
favorite_language=' python '
print(favorite_language,'\n',favorite_language.rstrip(),'\n',favorite_language.lstrip(),'\n',favorite_language.strip())
2018/04/20
迭代:给定一个list或者tuple,我们可以通过for循环语句来遍历这个lsit或者tuple。称之为迭代(Iteration)
在python中,迭代可以通过for...in...完成。
作业:请使用迭代查找一个list中最小和最大值,并返回一个tuple:
def findminandmax(L):
if(L==[]):
return(None,None)
else:
min=L[0]
max=L[0]
for n in L:
if(min>n):
min=n
if(max)<n:
max=n
return(min,max)
#测试
if findminandmax([]) != (None, None):
print('测试失败!')
elif findminandmax([7]) != (7, 7):
print('测试失败!')
elif findminandmax([7, 1]) != (1, 7):
print('测试失败!')
elif findminandmax([7, 1, 3, 9, 5]) != (1, 9):
print('测试失败!')
else:
print('测试成功!')
作业:
如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()
方法,所以列表生成式会报错:
>>> L = ['Hello', 'World', 18, 'Apple', None]
>>> [s.lower() for s in L]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
AttributeError: 'int' object has no attribute 'lower'
使用内建的isinstance
函数可以判断一个变量是不是字符串:
>>> x = 'abc'
>>> y = 123
>>> isinstance(x, str)
True
>>> isinstance(y, str)
False
请修改列表生成式,通过添加if
语句保证列表生成式能正确地执行:
L1 = ['Hello', 'World', 18, 'Apple', None]
L2 =[s.lower() for s in L1 if isinstance(s,str)==True]
# 测试:
print(L2)
if L2 == ['hello', 'world', 'apple']:
print('测试通过!')
else:
print('测试失败!')
2018/04/21补充:参数.title()#title()函数会将字符串开头单词变为大写
2018/04/21
今天买的当当实体书到了,开心&加油
生成器:generator
作业:杨辉三角的实现:
1
/ \
1 1
/ \ / \
1 2 1
/ \ / \ / \
1 3 3 1
/ \ / \ / \ / \
1 4 6 4 1
/ \ / \ / \ / \ / \
1 5 10 10 5 1
把每一行看做一个list,试写一个generator,不断输出下一行的list: