Can it be made faster, and I am a newbie to complexity but I'm pretty sure the average case for this would be O(n). Am I wrong?
Output for the first list should be: (1,9), (2,8), (5,5), (-11,21)
    #find pairs of an array whose sum is equal to ten
    #bonus do it im linear time

    list1 = [1,1,2,1,9,9,5,5,2,3,745,8,1,-11,21]
    list2 = [1,1,1,1,9,9,9,9,2,8,8,8,2,2,0,0,0]
    list3 = ["dog", "cat", "penguin", 9, 1]
    list4 = []

    def find_pairs_sum_n(list1, n):
	    set1 = set(list1)
	    history = set()
	
	    if not list1:
		    print("list is empty")
		    raise StopIteration
	    if not all(isinstance(n, int) for n in list1):
		    print("list must contain only integers")
		    raise StopIteration
		
	    for x in set1:
		    history.add(x)
		    if (n - x) in set1 and (n-x) not in history:
			    yield (x, n - x)
			
		    elif x == n/2 and list1.count(n/2) > 1:
			    yield (int(n/2), int(n/2))

			
    x = find_pairs_sum_n(list1, 10)
    for i in x:
	    print(i)
	
    y = find_pairs_sum_n(list2, 10)
    for i in y:
	    print(i)

    z = find_pairs_sum_n(list3, 10)
    print(next(z))

    w = find_pairs_sum_n(list4, 10)
    print(next(w))